diff --git a/docs/img/callgraph.png b/docs/img/callgraph.png new file mode 100644 index 0000000..0235f03 Binary files /dev/null and b/docs/img/callgraph.png differ diff --git a/docs/webapp_xhprof-profiler_integration.md b/docs/webapp_xhprof-profiler_integration.md new file mode 100644 index 0000000..ee24afc --- /dev/null +++ b/docs/webapp_xhprof-profiler_integration.md @@ -0,0 +1,188 @@ +# Integration of XHProf profiler to the OpenSILEX WebApp (use case: export of all scientific objects) + +## I/ Prerequisite +- 1/ [XHProf-Tideways extension](https://github.com/tideways/php-xhprof-extension.git) + +- 2/ [Tideways Toolkit (tk)](https://github.com/tideways/toolkit.git) *A collection of commandline tools* + + +- 3/ [Graphviz](https://doc.ubuntu-fr.org/graphviz) *Graph Visualization Software* + + +
+ + +## 1/ Installation of XHProf-Tideways + +XHProf is a profiler designed to analyze PHP applications. Initially created and open sourced by Facebook (compatible with php5). Tideways company maintain a fork of the original XHProf extension that provides PHP 7 support [Tideways XHProf extension](https://github.com/tideways/php-xhprof-extension.git). + + +### Install the server Dependencies + + + +```console +user@phis:~$ sudo apt install php7.0-dev + +//install the extension from source +user@phis:~$ git clone https://github.com/tideways/php-xhprof-extension.git +user@phis:~$ cd php-xhprof-extension/ +user@phis:~$ phpize +user@phis:~$ ./configure +user@phis:~$ make +user@phis:~$ sudo make install +``` + +Include the following contents in the php.ini file: +``` +extension=tideways_xhprof.so +``` +Restart Apache +```console +user@phis:~$ sudo systemctl restart apache2 +``` + + +## 2/ Installation of Tideways Toolkit (tk) + +### Prerequisite +- [Go](https://golang.org/dl/) *Tideways Toolkit is written in Go and you can install it with the Go compiler* + +```console +user@phis:~$ go get github.com/tideways/toolkit +``` + +You will then find the compiled binary in ```/home/$USER/code/golang/bin/toolkit``` and can copy or symlink it to ```/usr/local/bin/tk``` +
+ + +## 3/ Installation of Graphviz +```console +user@phis:~$ sudo apt install graphviz +``` +
+
+ +## II/ Profilling OpenSILEX webapp (export of scientific objects use case) + +### Code source integration + +Add the fellowing instructions to enable and disable the profiler + +```php +if (extension_loaded('tideways_xhprof')) { + tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY | TIDEWAYS_XHPROF_FLAGS_CPU); +} +``` + + +```php +if (extension_loaded('tideways_xhprof')) { + $data = tideways_xhprof_disable(); + file_put_contents( + sys_get_temp_dir() . "/ScientificObjectController_profiling.xhprof", + json_encode($data) + ); +} +``` + +In this case we enable the profiler when starting export of scientific objects and disable it before sending the result. + +```php +>>>>>>>>> XHProf integration +if (extension_loaded('tideways_xhprof')) { + tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY | TIDEWAYS_XHPROF_FLAGS_CPU); +} +//----------<<<<<<<<<< + + +$searchModel = new ScientificObjectSearch(); +if (isset($_GET['model'])) { + $searchParams = $_GET['model']; + $searchModel->label = isset($searchParams["alias"]) ? $searchParams["alias"] : null; //why alias ? and not label , c'est quoi l'alias ? + $searchModel->type = isset($searchParams["type"]) ? $searchParams["type"] : null; + $searchModel->experiment = isset($searchParams["experiment"]) ? $searchParams["experiment"] : null; +} +$searchParams = []; // ??? +// Set page size to 10000 for better performances +$searchModel->pageSize = 10000; +//get all the data (if multiple pages) and write them in a file +$serverFilePath = \config::path()['documentsUrl'] . "AOFiles/exportedData/" . time() . ".csv"; +$stringToWrite = "ScientificObjectURI" . Yii::$app->params['csvSeparator'] . + "Alias" . Yii::$app->params['csvSeparator'] . + "RdfType" . Yii::$app->params['csvSeparator'] . + "ExperimentURI" . Yii::$app->params['csvSeparator'] . + "Geometry" . + "\n"; +$totalPage = 1; +for ($i = 0; $i < $totalPage; $i++) { + //1. call service for each page + $searchParams["page"] = $i; + $searchResult = $searchModel->search(Yii::$app->session['access_token'], $searchParams); + //2. write in file + $models = $searchResult->getmodels(); + foreach ($models as $model) { + // Parse geoJson geometry to WKT if exists + $geoJson = $model->geometry; + if ($geoJson != null) { + $geom = \geoPHP::load($model->geometry, 'json'); + $wktGeometry = (new \WKT())->write($geom); + } else { + $wktGeometry = ""; + } + + $stringToWrite .= $model->uri . Yii::$app->params['csvSeparator'] . + $model->label . Yii::$app->params['csvSeparator'] . + $model->rdfType . Yii::$app->params['csvSeparator'] . + $model->experiment . Yii::$app->params['csvSeparator'] . + '"' . $wktGeometry . '"' . Yii::$app->params['csvSeparator'] . + "\n"; + } + $totalPage = intval($searchModel->totalPages); +} +file_put_contents($serverFilePath, $stringToWrite, FILE_APPEND); + +//---------->>>>>>>>>> XHProf integration +if (extension_loaded('tideways_xhprof')) { + $data = tideways_xhprof_disable(); + file_put_contents( + sys_get_temp_dir() . "/ScientificObjectController_profiling.xhprof", + json_encode($data) + ); +} +//----------<<<<<<<<<< + +Yii::$app->response->sendFile($serverFilePath); +} + + +``` + +### Generation of callgraph visualization +```console +user@phis:~$ cd /tmp +user@phis:~$ tk generate-xhprof-graphviz ScientificObjectController_profiling.xhprof +``` + + +### Convert callgraph to a viewable image +```console +user@phis:~$ dot -Tpng callgraph.dot > callgraph.png +``` + +callgraph.png + + + + + + + + + \ No newline at end of file