mirror of
https://github.com/php-win-ext/php-sdk-binary-tools.git
synced 2026-03-24 17:12:12 +01:00
Compare commits
73 Commits
php-sdk-2.
...
php-sdk-2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ad971020a | ||
|
|
386d36c251 | ||
|
|
bd9c9ca4d8 | ||
|
|
1d6561c7d5 | ||
|
|
307c5ed4bc | ||
|
|
c6874e5109 | ||
|
|
c3cf4266ad | ||
|
|
01e4fff84a | ||
|
|
4357adc956 | ||
|
|
0a33374aed | ||
|
|
ff16eebfce | ||
|
|
afc302d27e | ||
|
|
e6c79ecad5 | ||
|
|
80dc35f668 | ||
|
|
bd3e1603a9 | ||
|
|
8505dda9c4 | ||
|
|
b15cdb1f92 | ||
|
|
91302e8142 | ||
|
|
f655bcf7d1 | ||
|
|
89bc6e0eb8 | ||
|
|
4d9b189d04 | ||
|
|
ff33ae5143 | ||
|
|
3cf0f67f27 | ||
|
|
b0a93f01c5 | ||
|
|
e10c86c2d5 | ||
|
|
20ccc545bd | ||
|
|
0be0ba3a84 | ||
|
|
c2e3b0ec40 | ||
|
|
b0b61457b4 | ||
|
|
c4ba07a627 | ||
|
|
2c54b0baf5 | ||
|
|
ca942978ee | ||
|
|
6153bb9af2 | ||
|
|
c4ce390679 | ||
|
|
2040ea78bd | ||
|
|
90f5c1633e | ||
|
|
5a44f0b05d | ||
|
|
c84b3e6b9e | ||
|
|
a861392d45 | ||
|
|
0474318721 | ||
|
|
b21fad7268 | ||
|
|
5748dedb3b | ||
|
|
4cea7a4f66 | ||
|
|
7e8235f1a1 | ||
|
|
1122cbd9d9 | ||
|
|
7a054e9e6d | ||
|
|
a6f819dd75 | ||
|
|
b8b32aaa27 | ||
|
|
dbeb065486 | ||
|
|
c2880591f3 | ||
|
|
6911eacb83 | ||
|
|
218f23ab93 | ||
|
|
1684c7e2c7 | ||
|
|
fb396f33e6 | ||
|
|
1deb33bebc | ||
|
|
d00bcf80d0 | ||
|
|
1d645c9faf | ||
|
|
c9ff81440a | ||
|
|
c3a4890b8a | ||
|
|
ac53945a3f | ||
|
|
c7ad0fd314 | ||
|
|
76ed6e3374 | ||
|
|
f3cbba7fc5 | ||
|
|
1d4d208f4b | ||
|
|
6711f1f6d1 | ||
|
|
1ba1bf1dff | ||
|
|
1048a4d346 | ||
|
|
ed4f2d50d0 | ||
|
|
75124abf52 | ||
|
|
58d2c1a009 | ||
|
|
dfdea742dc | ||
|
|
0553f3219f | ||
|
|
2cbe03f44c |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -20,3 +20,7 @@ oracle
|
||||
#pgo-build
|
||||
#rmtools*
|
||||
phpsdk-local.bat
|
||||
pgo/work
|
||||
!pgo/tpl/php
|
||||
!lib/php/libsdk/SDK/Build/PGO/Server/PHP
|
||||
*.swp
|
||||
|
||||
18
LICENSE
18
LICENSE
@@ -1,9 +1,9 @@
|
||||
Copyright 2017 Anatol Belski
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
Copyright 2017-2018 Anatol Belski
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
66
README.md
66
README.md
@@ -1,14 +1,14 @@
|
||||
# PHP SDK
|
||||
|
||||
PHP SDK is a tool kit for Windows PHP builds
|
||||
PHP SDK is a tool kit for Windows PHP builds.
|
||||
|
||||
# License
|
||||
|
||||
The PHP SDK itself and the SDK own tools are licensed under the BSD 2-Clause license. With the usage of the other tools, you accept the respective licenses.
|
||||
The PHP SDK itself and the SDK own tools and code are licensed under the BSD 2-Clause license. With the usage of the other tools, you accept the respective licenses.
|
||||
|
||||
# Overview
|
||||
|
||||
The PHP SDK 2.0 is compatible with PHP 7.0 and above. The compatibility with [older versions](http://windows.php.net/downloads/php-sdk/php-sdk-binary-tools-20110915.zip "php-sdk-binary-tools-20110915.zip") is kept, also available from the [legacy branch](https://github.com/OSTC/php-sdk-binary-tools/tree/legacy). The toolset was significantly revamped. Newer tools are now available, better workflows are now possible. The toolset consists on a mix of the hand written scripts, selected MSYS2 parts and standalone programs.
|
||||
The PHP SDK 2.0+ is compatible with PHP 7.0 and above. The compatibility with [older versions](http://windows.php.net/downloads/php-sdk/php-sdk-binary-tools-20110915.zip "php-sdk-binary-tools-20110915.zip") is kept, also available from the [legacy branch](https://github.com/Microsoft/php-sdk-binary-tools/tree/legacy). The toolset was significantly revamped. Newer tools are now available, better workflows are now possible. The toolset consists on a mix of the hand written scripts, selected MSYS2 parts and standalone programs.
|
||||
|
||||
# Requirements
|
||||
|
||||
@@ -26,13 +26,14 @@ All the tools included are either scripts or 32-bit binaries. They are therefore
|
||||
- starter scripts, named phpsdk-<crt>-<arch>.bat
|
||||
- `phpsdk_buildtree` - initialize the development filesystem structure
|
||||
- `phpsdk_deps` - handle dependency libraries
|
||||
- `phpsdk_version` - show SDK version
|
||||
- `phpsdk_dllmap` - create a JSON listing of DLLs contained in zip files
|
||||
- `phpsdk_pgo` - run PGO training
|
||||
- `phpsdk_version` - show SDK version
|
||||
- `task.exe` - wrapper to hide the given command line
|
||||
|
||||
## Other tools
|
||||
|
||||
- `bison` 3.0.2, `re2c` 0.15.3, `lemon`
|
||||
- `bison` 3.0.4, `re2c` 1.0.3, `lemon`
|
||||
- `awk`, `gawk`, `sed`, `grep`
|
||||
- `diff`, `diff3`, `patch`
|
||||
- `md5sum`, `sha1sum`, `sha224sum`, `sha256sum`, `sha384sum`, `sha512sum`
|
||||
@@ -47,6 +48,7 @@ These are not included with the PHP SDK, but might be useful. While Visual C++ i
|
||||
- `Cppcheck` - used for static analysis
|
||||
- `clang` - useful for experimental builds and for static analysis
|
||||
- `ICC` - useful for experimental builds
|
||||
- `ConEmu` - console emulator with tabs and more
|
||||
|
||||
# Usage
|
||||
|
||||
@@ -58,38 +60,40 @@ It is not required to hold the source in the PHP SDK directory. It could be usef
|
||||
|
||||
## Basic usage example
|
||||
|
||||
- `git clone https://github.com/OSTC/php-sdk-binary-tools.git c:\php-sdk`
|
||||
- `git clone https://github.com/Microsoft/php-sdk-binary-tools.git c:\php-sdk`
|
||||
- `cd c:\php-sdk`
|
||||
- `git checkout php-sdk-2.0.0` or later
|
||||
- `git checkout php-sdk-2.0.12` or later
|
||||
- invoke `phpsdk-vc15-x64.bat`
|
||||
- `phpsdk_buildtree phpmaster`
|
||||
- `git clone https://github.com/php/php-src.git && cd php-src`, or fetch a zipball
|
||||
- `phpsdk_deps --update --branch master`, use PHP-X.Y for a non master branch
|
||||
- `phpsdk_deps --update --branch master`, use `phpsdk_deps --update --branch X.Y` for a non master branch
|
||||
- do the build, eg. `buildconf && configure --enable-cli && nmake`
|
||||
|
||||
More extensive documentation can be found on the [wiki](https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2 "PHP wiki page").
|
||||
|
||||
## The old way
|
||||
|
||||
- `git clone https://github.com/OSTC/php-sdk-binary-tools.git c:\php-sdk`
|
||||
- `git clone https://github.com/Microsoft/php-sdk-binary-tools.git c:\php-sdk`
|
||||
- follow the instructions on the PHP [wiki page](https://wiki.php.net/internals/windows/stepbystepbuild "PHP wiki page")
|
||||
|
||||
# Customizing
|
||||
|
||||
## Custom environment setup
|
||||
|
||||
A sript called phpsdk-local.bat has to be put into the PHP SDK root. If present, it will be automatically picked up by the starter script. A template for such a script is included with the PHP SDK. This allows to automatically meet any required preparations, that are not foreseen by the standard PHP SDK startup. Be careful while creating your own phpsdk-local. It's your responsibility to ensure the regular PHP SDK startup isn't broken after phpsdk-local.bat was injected into the startup sequence.
|
||||
A script called phpsdk-local.bat has to be put into the PHP SDK root. If present, it will be automatically picked up by the starter script. A template for such a script is included with the PHP SDK. This allows to automatically meet any required preparations, that are not foreseen by the standard PHP SDK startup. Be careful while creating your own phpsdk-local. It's your responsibility to ensure the regular PHP SDK startup isn't broken after phpsdk-local.bat was injected into the startup sequence.
|
||||
|
||||
## Console emulator integration
|
||||
|
||||
The starter scripts can be also easy integrated with the consoles other than standard cmd.exe. For the reference, here's an example ConEmu task
|
||||
|
||||
`C:\php-sdk\phpsdk-vc14-x64.bat -cur_console:d:C:\php-sdk\php70\vc14\x64\php-src`
|
||||
`C:\php-sdk\phpsdk-vc15-x64.bat -cur_console:d:C:\php-sdk\php72\vc15\x64\php-src`
|
||||
|
||||
## Unattended builds
|
||||
|
||||
An elementary functionality to run unattended builds is included. See an example on how to setup a simple unattended build task in the doc directory.
|
||||
|
||||
Be aware, that starter scripts always start a new shell. Scripts intended to run as a task need to be passed with `-t` argument to a starter script.
|
||||
|
||||
# Upgrading
|
||||
|
||||
- backup phpsdk-local.bat
|
||||
@@ -102,17 +106,49 @@ If the PHP SDK is kept as a git checkout, merely what is needed instead is to gi
|
||||
|
||||
# Extending
|
||||
|
||||
The SDK tools are based on the KISS principle and should be kept so. Basic tools are implemented as simple batch script. The minimalistic `PHP` is available for internal SDK purposes. It can be used, if more complexity is required. If you have an idea for some useful tool or workflow, please open a ticket or PR, so it can be discussed, implemented and added to the SDK. By contributing an implementation, you should also accept the SDK license.
|
||||
The SDK tools are based on the KISS principle and should be kept so. Basic tools are implemented as simple batch script. The minimalistic `PHP` is available for internal SDK purposes. It can be used, if more complexity is required. A suitable PHP binary is bound with the PHP SDK. If you have an idea for some useful tool or workflow, please open a ticket or PR, so it can be discussed, implemented and added to the SDK. By contributing an implementation, you should also accept the SDK license.
|
||||
|
||||
# PGO
|
||||
|
||||
As of the version 2.1.0, the SDK includes a tool for the [PGO](https://docs.microsoft.com/en-us/cpp/build/reference/profile-guided-optimizations) optimization. Several training cases are included by default, which are based on the real life opensource applications. The PGO optimization can give an overall speedup up to 30%. The work on adding more training scenarios for the widely used opensource apps is ongoing. If you have a training scenario to share, please create a PR to this repo. Any new training cases are thoroughly validated through the extensive performance tests.
|
||||
|
||||
## Preparing PGO training environment
|
||||
- the pgo folder in the SDK root dir contains templates and scenarios for PGO training
|
||||
- adjust and execute [doc/phpsdk_pgo_prep_elevated.bat.example](doc/phpsdk_pgo_prep_elevated.bat.example) to open ports required for PHP SDK training servers
|
||||
- run `phpsdk_pgo --init`
|
||||
|
||||
## Creating PGO build
|
||||
- compile PHP configured using `--enable-pgi`
|
||||
- run `phpsdk_pgo --train`
|
||||
- run `nmake clean-pgo`
|
||||
- rebuild PHP `--with-pgo`
|
||||
|
||||
## Adding custom PGO training scenario
|
||||
|
||||
A custom scenario can be used to produce a custom PHP binary dedicated to an arbitrary application.
|
||||
|
||||
The existing training cases can be found in [pgo/cases](pgo/cases). Assumed the case would be named `myapp`, the general steps to setup were
|
||||
|
||||
- create the case directory under `pgo/cases/myapp`
|
||||
- create `pgo/cases/myapp/phpsdk_pgo.json` with the necessary definitions
|
||||
- create `pgo/cases/myapp/nginx.partial.conf` with a partial NGINX template
|
||||
- create `pgo/cases/myapp/TrainingCaseHandler.php` with a class as defined in the [interface](lib/php/libsdk/SDK/Build/PGO/Interfaces/TrainingCase.php)
|
||||
|
||||
After a training case is implemented and put under `pgo/cases`, the work environment needs to be reinitialized. The tool puts all the training data and necessary applications under `pgo/work`. Rename or remove that directory and rerun `phpsdk_pgo --init`.
|
||||
|
||||
To skip a training case, add a file named `inactive` into the case folder.
|
||||
|
||||
|
||||
# Pitfalls
|
||||
|
||||
- SDK or PHP sources put into paths including spaces might cause issue.
|
||||
- SDK or PHP sources put into too long paths, will cause an issue.
|
||||
- If Cygwin is installed, it might cause issues. If it's unavoidable, to have Cygwin on the same machine, ensure SDK preceeds it on the PATH.
|
||||
- When fetching from git, git `core.autocrlf` configuration directive set to `false` is recommended.
|
||||
- If Cygwin, MSYS2 or MinGW flavors are exposed in global PATH, it might cause issues. If it's unavoidable, ensure SDK preceeds it on the PATH.
|
||||
- When fetching the binary SDK from git, git `core.autocrlf` configuration directive set to `false` is recommended.
|
||||
- Tools, based on MSYS2, only accept paths with forward slashes.
|
||||
- Both Visual C++ toolset and the Windows SDK components have to be installed for the PHP SDK to work properly.
|
||||
- The VC++ toolset is still requried, even if another compiler, fe. clang, is intended to be used.
|
||||
- task.exe is not a console application, some systems might not propagate exit code except the batch is explicitly run from `cmd /c`, etc.
|
||||
- `task.exe` is not a console application, some systems might not propagate exit code except the batch is explicitly run from `cmd /c`, etc.
|
||||
- `7za` should be prefered over `unzip` and `zip` for compatibility reasons.
|
||||
|
||||
|
||||
|
||||
BIN
bin/7za.dll
BIN
bin/7za.dll
Binary file not shown.
BIN
bin/7za.exe
BIN
bin/7za.exe
Binary file not shown.
BIN
bin/7zxa.dll
BIN
bin/7zxa.dll
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/php/php.exe
BIN
bin/php/php.exe
Binary file not shown.
BIN
bin/php/php7.dll
BIN
bin/php/php7.dll
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
include dirname(__FILE__) . "/../lib/php/libsdk/autoload.php";
|
||||
include dirname(__FILE__) . "/../lib/php/autoload.php";
|
||||
|
||||
use SDK\{Config, Exception};
|
||||
|
||||
|
||||
14
bin/phpsdk_pgo.bat
Normal file
14
bin/phpsdk_pgo.bat
Normal file
@@ -0,0 +1,14 @@
|
||||
@echo off
|
||||
|
||||
if "%PHP_SDK_PHP_CMD%"=="" (
|
||||
call %~dp0phpsdk_setvars.bat
|
||||
if "!PHP_SDK_PHP_CMD!"=="" (
|
||||
echo PHP SDK is not setup
|
||||
exit /b 3
|
||||
)
|
||||
)
|
||||
|
||||
cmd /c %PHP_SDK_PHP_CMD% %PHP_SDK_BIN_PATH%\phpsdk_pgo.php %*
|
||||
|
||||
exit /b %errorlevel%
|
||||
|
||||
127
bin/phpsdk_pgo.php
Normal file
127
bin/phpsdk_pgo.php
Normal file
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
include dirname(__FILE__) . "/../lib/php/autoload.php";
|
||||
|
||||
use SDK\Config;
|
||||
use SDK\Exception;
|
||||
use SDK\Build\PGO\Controller;
|
||||
|
||||
$sopt = "itudhs:fr";
|
||||
$lopt = array("init", "train", "up", "down", "help", "scenario:", "force", "ready");
|
||||
|
||||
$cmd = NULL;
|
||||
/* TODO For now we simply check the current php build, this could be extended to take arbitrary binaries. */
|
||||
$deps_root = NULL;
|
||||
$php_root = NULL;
|
||||
$scenario = NULL;
|
||||
$force = false;
|
||||
|
||||
try {
|
||||
$opt = getopt($sopt, $lopt);
|
||||
foreach ($opt as $name => $val) {
|
||||
switch ($name) {
|
||||
case "i":
|
||||
case "init":
|
||||
$cmd = "init";
|
||||
break;
|
||||
case "ready":
|
||||
$cmd = "check_init";
|
||||
break;
|
||||
case "t":
|
||||
case "train":
|
||||
$cmd = "train";
|
||||
break;
|
||||
case "u":
|
||||
case "up":
|
||||
$cmd = "up";
|
||||
break;
|
||||
case "d":
|
||||
case "down":
|
||||
$cmd = "down";
|
||||
break;
|
||||
case "s":
|
||||
case "scenario":
|
||||
$scenario = $val;
|
||||
break;
|
||||
case "f":
|
||||
case "force":
|
||||
$force = true;
|
||||
break;
|
||||
case "h": case "help":
|
||||
usage(0);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (NULL === $cmd) {
|
||||
usage();
|
||||
}
|
||||
|
||||
$deps_root = Config::getDepsLocalPath();
|
||||
|
||||
if ("check_init" != $cmd) {
|
||||
/* XXX Need these checks for more safety, as long as the dist zipballs are not supported. */
|
||||
if (!file_exists("Makefile")) {
|
||||
throw new Exception("Makefile not found. Arbitrary php snapshots are not supported yet, switch to the php source dir.");
|
||||
}
|
||||
if (preg_match(",BUILD_DIR=(.+),", file_get_contents("Makefile"), $m)) {
|
||||
$php_root = trim($m[1]);
|
||||
}
|
||||
if (!$php_root || !file_exists($php_root)) {
|
||||
throw new Exception("Invalid php root dir encountered '$php_root'.");
|
||||
}
|
||||
}
|
||||
|
||||
$controller = new Controller($cmd, $scenario);
|
||||
$controller->handle($force);
|
||||
|
||||
if ("check_init" == $cmd) {
|
||||
/* 0 for success, fail otherwise. */
|
||||
$ret = ($controller->isInitialized() === false);
|
||||
exit((int)$ret);
|
||||
}
|
||||
|
||||
/*$env = getenv();
|
||||
$env["PATH"] = $deps_root . DIRECTORY_SEPARATOR . "bin;" . $env["PATH"];
|
||||
|
||||
$php = $php_root . DIRECTORY_SEPARATOR . "php.exe";
|
||||
$php = $php_root . DIRECTORY_SEPARATOR . "php.exe";*/
|
||||
|
||||
} catch (Throwable $e) {
|
||||
throw $e;
|
||||
exit(3);
|
||||
}
|
||||
|
||||
|
||||
function usage(int $code = -1)
|
||||
{
|
||||
echo "PHP SDK PGO training tool.", PHP_EOL;
|
||||
echo "Usage: ", PHP_EOL, PHP_EOL;
|
||||
echo "Commands:", PHP_EOL;
|
||||
echo " -i --init Initialize training environment.", PHP_EOL;
|
||||
echo " -t --train Run training. This involves startup, training and shutdown.", PHP_EOL;
|
||||
echo " -u --up Startup training environment.", PHP_EOL;
|
||||
echo " -d --down Shutdown training environment.", PHP_EOL;
|
||||
echo " -f --force Force requested operation. Not every option can be forced.", PHP_EOL;
|
||||
echo " -s --scenario Run training with a specified scenario.", PHP_EOL;
|
||||
|
||||
/*echo " -p --php-root PHP binary to train.", PHP_EOL;*/
|
||||
|
||||
$code = -1 == $code ? 0 : $code;
|
||||
exit($code);
|
||||
}
|
||||
|
||||
function msg(string $s, int $code = 0) {
|
||||
echo $s, PHP_EOL;
|
||||
exit($code);
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: sw=4 ts=4 fdm=marker
|
||||
* vim<600: sw=4 ts=4
|
||||
*/
|
||||
@@ -98,6 +98,21 @@ set TMPKEY=
|
||||
|
||||
if 15 gtr %PHP_SDK_VC_NUM% (
|
||||
rem get sdk dir
|
||||
rem if 10.0 is available, it's ok
|
||||
if /i "%PHP_SDK_OS_ARCH%"=="x64" (
|
||||
set TMPKEY=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
|
||||
) else (
|
||||
set TMPKEY=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0
|
||||
)
|
||||
for /f "tokens=2*" %%a in ('reg query "!TMPKEY!" /v InstallationFolder') do (
|
||||
for /f "tokens=2*" %%c in ('reg query "!TMPKEY!" /v ProductVersion') do (
|
||||
if exist "%%bInclude\%%d.0\um\Windows.h" (
|
||||
goto got_sdk
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
rem Otherwise 8.1 should be available anyway
|
||||
if /i "%PHP_SDK_OS_ARCH%"=="x64" (
|
||||
set TMPKEY=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v8.1
|
||||
) else (
|
||||
@@ -105,13 +120,13 @@ if 15 gtr %PHP_SDK_VC_NUM% (
|
||||
)
|
||||
for /f "tokens=2*" %%a in ('reg query "!TMPKEY!" /v InstallationFolder') do (
|
||||
if exist "%%b\Include\um\Windows.h" (
|
||||
set PHP_SDK_WIN_SDK_DIR=%%b
|
||||
goto got_sdk
|
||||
)
|
||||
)
|
||||
if not defined PHP_SDK_WIN_SDK_DIR (
|
||||
echo Windows SDK not found.
|
||||
goto out_error;
|
||||
)
|
||||
|
||||
echo Windows SDK not found.
|
||||
goto out_error;
|
||||
:got_sdk
|
||||
set TMPKEY=
|
||||
)
|
||||
|
||||
|
||||
BIN
bin/vswhere.exe
BIN
bin/vswhere.exe
Binary file not shown.
@@ -1,9 +1,5 @@
|
||||
@echo off
|
||||
|
||||
rem edit if PGO scripts are present and are to be used
|
||||
rem set PHP_SDK_PGO_TOOLS_ROOT_PATH=%PHP_SDK_ROOT_PATH%\pgo
|
||||
rem set PATH=%PHP_SDK_PGO_TOOLS_ROOT_PATH%\bin;%PATH%
|
||||
|
||||
set PGSQL_TEST_CONNSTR=host=127.0.0.1 dbname=test port=5432 user=test password=test
|
||||
set PDO_PGSQL_TEST_DSN=pgsql:host=127.0.0.1 port=5432 dbname=test user=test password=test
|
||||
|
||||
|
||||
47
doc/phpsdk_pgo_prep_elevated.bat.example
Normal file
47
doc/phpsdk_pgo_prep_elevated.bat.example
Normal file
@@ -0,0 +1,47 @@
|
||||
|
||||
|
||||
@echo off
|
||||
rem These are default ports for the servers used for the training. If these
|
||||
rem ports are changed in the config templates, the commands have to be
|
||||
rem adjusted as well. New servers have to be added here as well. Run this
|
||||
rem file on the elevated shell before starting the PGO environment setup
|
||||
rem using the relevant port numbers, especially for unattended PGO builds.
|
||||
rem We add opens inbound ports from the default PGO config templates and
|
||||
rem and the one increment by 1, just co cover a simple case the port number
|
||||
rem was incremented by the auto configuration.
|
||||
rem
|
||||
rem Alternatively, the firewall can be disabled on the build host.
|
||||
rem The commands to disable\enable firewall are
|
||||
rem netsh advfirewall set allprofiles state on
|
||||
rem netsh advfirewall set allprofiles state off
|
||||
@echo on
|
||||
|
||||
rem NGINX
|
||||
netsh advfirewall firewall add rule name="NGINX for PGO" dir=in action=allow program="C:\php-snap-build\php-sdk\pgo\work\server\nginx\nginx.exe" profile=private
|
||||
for \l %%p in (8081, 1, 8091) do (
|
||||
netsh advfirewall firewall add rule name="Open Port %%p for PHP PGO" dir=in action=allow protocol=TCP localport=%%p profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port %%p for PHP PGO" dir=in action=allow protocol=UDP localport=%%p profile=private
|
||||
)
|
||||
netsh advfirewall firewall add rule name="Open Port 80 for PHP PGO" dir=in action=allow protocol=TCP localport=80 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 80 for PHP PGO" dir=in action=allow protocol=UDP localport=80 profile=private
|
||||
|
||||
rem MariaDB
|
||||
netsh advfirewall firewall add rule name="MariaDB for PGO" dir=in action=allow program="c:\php-snap-build\php-sdk\pgo\work\server\mariadb\bin\mysqld.exe" profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 3307 for PHP PGO" dir=in action=allow protocol=TCP localport=3307 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 3307 for PHP PGO" dir=in action=allow protocol=UDP localport=3307 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 3308 for PHP PGO" dir=in action=allow protocol=TCP localport=3308 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 3308 for PHP PGO" dir=in action=allow protocol=UDP localport=3308 profile=private
|
||||
|
||||
rem Postgres
|
||||
netsh advfirewall firewall add rule name="Open Port 5434 for PHP PGO" dir=in action=allow protocol=TCP localport=5434 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 5434 for PHP PGO" dir=in action=allow protocol=UDP localport=5434 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 5435 for PHP PGO" dir=in action=allow protocol=TCP localport=5435 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 5435 for PHP PGO" dir=in action=allow protocol=UDP localport=5435 profile=private
|
||||
|
||||
rem PHP
|
||||
netsh advfirewall firewall add rule name="Open Port 9001 for PHP PGO" dir=in action=allow protocol=TCP localport=9001 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 9001 for PHP PGO" dir=in action=allow protocol=UDP localport=9001 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 9002 for PHP PGO" dir=in action=allow protocol=TCP localport=9002 profile=private
|
||||
netsh advfirewall firewall add rule name="Open Port 9002 for PHP PGO" dir=in action=allow protocol=UDP localport=9002 profile=private
|
||||
|
||||
|
||||
@@ -3,12 +3,12 @@ rem Task batch example.
|
||||
rem Create a task, put an action with the following data:
|
||||
rem Action: start a program
|
||||
rem Program/script: C:\php-sdk\bin\task.exe
|
||||
rem Add arguments: "C:\php-sdk\phpsdk-starter.bat -c vc14 -a x64 -t C:\php-sdk\unattended-build-task.bat"
|
||||
rem Add arguments: "C:\php-sdk\phpsdk-starter.bat -c vc15 -a x64 -t C:\php-sdk\unattended-build-task.bat"
|
||||
rem Run the task
|
||||
|
||||
set LOG_NAME=%PHP_SDK_VC%-%PHP_SDK_ARCH%-task.log
|
||||
|
||||
pushd C:\php-sdk\php70\vc14\x64\php-src
|
||||
pushd C:\php-sdk\php72\vc14\x64\php-src
|
||||
|
||||
git pull --rebase > %LOG_NAME% 2>&1
|
||||
|
||||
|
||||
26
lib/php/autoload.php
Normal file
26
lib/php/autoload.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
spl_autoload_register(function($name) {
|
||||
$fl = dirname(__FILE__) . DIRECTORY_SEPARATOR . "libsdk" . DIRECTORY_SEPARATOR . $name . ".php";
|
||||
|
||||
if (file_exists($fl)) {
|
||||
require_once $fl;
|
||||
}
|
||||
});
|
||||
|
||||
spl_autoload_register(function($name) {
|
||||
$fl = getenv("PHP_SDK_ROOT_PATH") . DIRECTORY_SEPARATOR . "pgo" . DIRECTORY_SEPARATOR . "cases" . DIRECTORY_SEPARATOR . $name . ".php";
|
||||
|
||||
if (file_exists($fl)) {
|
||||
require_once $fl;
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: sw=4 ts=4 fdm=marker
|
||||
* vim<600: sw=4 ts=4
|
||||
*/
|
||||
@@ -15,12 +15,13 @@ class Fetcher
|
||||
protected $series;
|
||||
|
||||
|
||||
public function __construct(string $host, int $port, string $arch = NULL, string $stability = NULL, Series $series = NULL)
|
||||
public function __construct(string $host, int $port, string $scheme = "https", string $arch = NULL, string $stability = NULL, Series $series = NULL)
|
||||
{/*{{{*/
|
||||
$this->stability = $stability;
|
||||
$this->arch = $arch;
|
||||
$this->host = $host;
|
||||
$this->port = $port;
|
||||
$this->scheme = $scheme;
|
||||
}/*}}}*/
|
||||
|
||||
public function getSeries() : Series
|
||||
@@ -35,11 +36,23 @@ class Fetcher
|
||||
|
||||
/* TODO more robust implementation. */
|
||||
/* TODO implement indicator. */
|
||||
public function getByUri($uri) : string
|
||||
public function getByUri(string $uri, int $retries = 3) : string
|
||||
{/*{{{*/
|
||||
$url = "http://{$this->host}:{$this->port}$uri";
|
||||
$url = "{$this->scheme}://{$this->host}:{$this->port}$uri";
|
||||
$ret = false;
|
||||
|
||||
return $this->download($url);
|
||||
retry:
|
||||
try {
|
||||
$ret = $this->download($url);
|
||||
} catch (Exception $e) {
|
||||
if ($retries > 0) {
|
||||
sleep(1);
|
||||
$retries--;
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}/*}}}*/
|
||||
|
||||
/*protected function fetch($uri) : string
|
||||
|
||||
@@ -13,6 +13,7 @@ class Manager
|
||||
protected $path;
|
||||
protected $series;
|
||||
protected $fetcher;
|
||||
protected $updatesFlag = NULL;
|
||||
|
||||
public function __construct(string $path, string $stability, string $arch)
|
||||
{/*{{{*/
|
||||
@@ -23,7 +24,8 @@ class Manager
|
||||
|
||||
$host = Config::getDepsHost();
|
||||
$port = Config::getDepsPort();
|
||||
$fetcher = new Fetcher($host, $port, $this->arch, $this->stability);
|
||||
$scheme = Config::getDepsUriScheme();
|
||||
$fetcher = new Fetcher($host, $port, $scheme, $this->arch, $this->stability);
|
||||
$series = new Series($this->stability, $this->arch, $this->cache, NULL);
|
||||
$fetcher->setSeries($series);
|
||||
$series->setFetcher($fetcher);
|
||||
@@ -39,7 +41,12 @@ class Manager
|
||||
|
||||
public function updatesAvailable() : bool
|
||||
{/*{{{*/
|
||||
return $this->series->updatesAvailable() || !file_exists(Config::getDepsLocalPath());
|
||||
if (!is_null($this->updatesFlag)) {
|
||||
return $this->updatesFlag;
|
||||
}
|
||||
|
||||
$this->updatesFlag = $this->series->updatesAvailable() || !file_exists(Config::getDepsLocalPath());
|
||||
return $this->updatesFlag;
|
||||
}/*}}}*/
|
||||
|
||||
/* FIXME implement rollback */
|
||||
|
||||
@@ -2,11 +2,12 @@
|
||||
|
||||
namespace SDK\Build\Dependency;
|
||||
|
||||
use SDK\Config;
|
||||
use SDK\Exception;
|
||||
use SDK\{Config, Exception, FileOps};
|
||||
|
||||
class Package
|
||||
{
|
||||
use FileOps;
|
||||
|
||||
protected $name;
|
||||
protected $series;
|
||||
protected $fetcher;
|
||||
@@ -44,15 +45,8 @@ class Package
|
||||
if (!$this->filepath || !file_exists($this->filepath)) {
|
||||
throw new Exception("Invalid filepath '{$this->filepath}'");
|
||||
}
|
||||
$zip = new \ZipArchive;
|
||||
|
||||
$ret = $zip->open($this->filepath);
|
||||
if (true === $ret) {
|
||||
$zip->extractTo($path);
|
||||
$zip->close();
|
||||
} else {
|
||||
throw new Exception("Failed to unpack, error code '$ret'");
|
||||
}
|
||||
$this->unzip($this->filepath, $path);
|
||||
}/*}}}*/
|
||||
|
||||
public function cleanup() : void
|
||||
|
||||
218
lib/php/libsdk/SDK/Build/PGO/Abstracts/PHP.php
Normal file
218
lib/php/libsdk/SDK/Build/PGO/Abstracts/PHP.php
Normal file
@@ -0,0 +1,218 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Abstracts;
|
||||
|
||||
use SDK\Build\PGO\Interfaces\Server;
|
||||
use SDK\Build\PGO\PHP\CLI;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
|
||||
abstract class PHP
|
||||
{
|
||||
protected $php_root;
|
||||
protected $php_ext_root;
|
||||
|
||||
protected function setupPaths()
|
||||
{
|
||||
$this->php_root = $this->getRootDir();
|
||||
if ($this->isDist()) {
|
||||
$this->php_ext_root = $this->php_root . DIRECTORY_SEPARATOR . "ext";
|
||||
if (!file_exists($this->php_ext_root)) {
|
||||
throw new Exception("Extension dir '{$this->php_ext_root}' doesn't exist.");
|
||||
}
|
||||
} else {
|
||||
$this->php_ext_root = $this->php_root;
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO Might be improved. */
|
||||
public function isDist() : bool
|
||||
{
|
||||
return !file_exists("Makefile") && file_exists("php.exe");
|
||||
}
|
||||
|
||||
protected function createEnv() : array
|
||||
{
|
||||
$env = getenv();
|
||||
|
||||
if (!$this->isDist()) {
|
||||
$deps_root = SDKConfig::getDepsLocalPath();
|
||||
foreach ($env as $k => $v) {
|
||||
if (strtoupper($k) == "PATH") {
|
||||
$env[$k] = "$deps_root" . DIRECTORY_SEPARATOR . "bin;" . $env[$k];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $env;
|
||||
}
|
||||
|
||||
public function getExtRootDir() : string
|
||||
{
|
||||
return $this->php_ext_root;
|
||||
}
|
||||
|
||||
public function getRootDir() : string
|
||||
{
|
||||
if ($this->php_root) {
|
||||
return $this->php_root;
|
||||
}
|
||||
|
||||
/* XXX adapt for any possible PHP variants. */
|
||||
$root = getenv("PHP_SDK_PGO_TEST_PHP_ROOT");
|
||||
if (!$root) {
|
||||
if (!$this->isDist()) {
|
||||
$s = file_get_contents("Makefile");
|
||||
if (preg_match(",BUILD_DIR=(.+),", $s, $m) > 0) {
|
||||
$root = trim($m[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!file_exists($root)) {
|
||||
throw new Exception("'$root' doesn't exist.");
|
||||
}
|
||||
|
||||
return $root;
|
||||
}
|
||||
|
||||
|
||||
public function getVersion(bool $short = false) : string
|
||||
{
|
||||
$ret = NULL;
|
||||
$cli = new CLI($this->conf, $this->scenario);
|
||||
|
||||
$out = shell_exec($cli->getExeFilename() . " -n -v");
|
||||
|
||||
if ($short) {
|
||||
if (preg_match(",PHP (\d+\.\d+),", $out, $m)) {
|
||||
$ret = $m[1];
|
||||
}
|
||||
} else {
|
||||
if (preg_match(",PHP ([^ ]+),", $out, $m)) {
|
||||
$ret = $m[1];
|
||||
}
|
||||
}
|
||||
|
||||
if (is_null($ret)) {
|
||||
throw new Exception("Failed to determine the test PHP version.");
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function isThreadSafe() : bool
|
||||
{
|
||||
$cli = new CLI($this->conf, $this->scenario);
|
||||
|
||||
$out = shell_exec($cli->getExeFilename() . " -n -v");
|
||||
|
||||
if (preg_match(",NTS,", $out, $m) > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function is64bit() : bool
|
||||
{
|
||||
$cli = new CLI($this->conf, $this->scenario);
|
||||
|
||||
$out = shell_exec($cli->getExeFilename() . " -n -v");
|
||||
|
||||
if (preg_match(",x64,", $out, $m) > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Need to cleanup it somewhere. */
|
||||
public function getIniFilename()
|
||||
{
|
||||
$ret = tempnam(sys_get_temp_dir(), "ini");
|
||||
|
||||
$tpl_vars = array(
|
||||
$this->conf->buildTplVarName("php", "extension_dir") => $this->php_ext_root,
|
||||
$this->conf->buildTplVarName("php", "error_log") => $this->getRootDir() . DIRECTORY_SEPARATOR . "pgo_run_error.log",
|
||||
);
|
||||
|
||||
$k = $this->is64bit() ? "x64" : "x86";
|
||||
$scenario_vars = (array)$this->conf->getSectionItem("php", "scenario", $this->scenario, "ini", $k);
|
||||
if ($scenario_vars) {
|
||||
foreach ($scenario_vars as $k => $v) {
|
||||
//$tpl_vars[$this->conf->buildTplVarName("php", "scenario", $this->scenario, str_replace(array(".", "-"), "_", $k))] = $v;
|
||||
$tpl_vars[$this->conf->buildTplVarName("php", str_replace(array(".", "-"), "_", $k))] = $v;
|
||||
}
|
||||
}
|
||||
|
||||
$this->conf->processTplFile(
|
||||
$this->getIniTplFilename(),
|
||||
$ret,
|
||||
$tpl_vars
|
||||
);
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
protected function getIniTplFilename()
|
||||
{
|
||||
$tpl_path = $this->conf->getTplDir("php");
|
||||
$version = $this->getVersion(true);
|
||||
$ts = $this->isThreadSafe() ? "ts" : "nts";
|
||||
|
||||
$construct = $tpl_path . DIRECTORY_SEPARATOR . "php-$version-pgo-$ts" . ("default" == $this->scenario ? "" : "-{$this->scenario}") . ".ini";
|
||||
|
||||
if (!file_exists($construct)) {
|
||||
throw new Exception("Couldn't locate PHP config under '$construct'.");
|
||||
}
|
||||
|
||||
return $construct;
|
||||
}
|
||||
|
||||
public function exec(string $php_cmd, string $args = NULL, array $extra_env = array()) : int
|
||||
{
|
||||
$env = $this->createEnv();
|
||||
$exe = $this->getExeFilename();
|
||||
$ini = $this->getIniFilename();
|
||||
|
||||
$cert_path = getenv("PHP_SDK_ROOT_PATH") . "\\msys2\\usr\\ssl\\cert.pem";
|
||||
$ini .= " -d curl.cainfo=$cert_path";
|
||||
|
||||
$spent_key = array();
|
||||
foreach ($env as $k0 => &$v0) {
|
||||
foreach ($extra_env as $k1 => $v1) {
|
||||
if (strtoupper($k0) == strtoupper($k1)) {
|
||||
/* XXX some more things could require extra handling. */
|
||||
if (strtoupper($k0) == "PATH") {
|
||||
$v0 = "$v1;$v0";
|
||||
} else {
|
||||
$v0 = $v1;
|
||||
}
|
||||
$spent_key[] = $k1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($extra_env as $k => $v) {
|
||||
if (in_array($k, $spent_key)) {
|
||||
continue;
|
||||
}
|
||||
$env[$k] = $v;
|
||||
}
|
||||
|
||||
$cmd = "$exe -n -c $ini " . ($args ? "$args " : "") . "$php_cmd";
|
||||
|
||||
$desc = array(
|
||||
0 => array("file", "php://stdin", "r"),
|
||||
1 => array("file", "php://stdout", "w"),
|
||||
2 => array("file", "php://stderr", "w")
|
||||
);
|
||||
$p = proc_open($cmd, $desc, $pipes, $this->getRootDir(), $env);
|
||||
|
||||
return proc_close($p);
|
||||
}
|
||||
}
|
||||
|
||||
22
lib/php/libsdk/SDK/Build/PGO/Abstracts/Server.php
Normal file
22
lib/php/libsdk/SDK/Build/PGO/Abstracts/Server.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Abstracts;
|
||||
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
|
||||
class Server
|
||||
{
|
||||
public function getName() : string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function getPhp() : Interfaces\PHP
|
||||
{
|
||||
return $this->php;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
151
lib/php/libsdk/SDK/Build/PGO/Abstracts/TrainingCase.php
Normal file
151
lib/php/libsdk/SDK/Build/PGO/Abstracts/TrainingCase.php
Normal file
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Abstracts;
|
||||
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool;
|
||||
|
||||
class TrainingCase
|
||||
{
|
||||
use FileOps;
|
||||
|
||||
const TYPE_WEB = "web";
|
||||
const TYPE_CLI = "cli";
|
||||
|
||||
protected $stat = array();
|
||||
|
||||
public function getType() : string
|
||||
{
|
||||
$type = $this->conf->getSectionItem($this->getName(), "type");
|
||||
|
||||
if (!$type) {
|
||||
$type = "web";
|
||||
}
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
public function run() : void
|
||||
{
|
||||
$training = new Tool\Training($this->conf, $this);
|
||||
$pgo = new Tool\PGO($this->conf, $this->php);
|
||||
|
||||
echo "Running " . $this->getName() . " training.\n";
|
||||
|
||||
$max_runs = $this->max_runs ?? 1;
|
||||
$max_runs = (int)$max_runs > 0 ? $max_runs : 1;
|
||||
$training->run($max_runs, $stat);
|
||||
|
||||
if ($this->getType() == "web") {
|
||||
echo "HTTP responses:\n";
|
||||
foreach ($stat["http_code"] as $code => $num) {
|
||||
printf(" %d received %d times\n", $code, $num);
|
||||
}
|
||||
if (count($stat["not_ok"]) > 0) {
|
||||
foreach($stat["not_ok"] as $st) {
|
||||
echo "Code: $st[http_code], URL: $st[url]", ($st["redirect_url"] ? ", Redirected to: $st[redirect_url]" : ""), "\n";
|
||||
}
|
||||
printf("\033[31m WARNING: Not all HTTP responses have indicated success, the PGO data might be unsuitable!\033[0m\n");
|
||||
}
|
||||
}
|
||||
|
||||
echo $this->getName() . " training complete.\n";
|
||||
|
||||
echo "Dumping PGO data for " . $this->getName() . ".\n";
|
||||
$pgo->dump();
|
||||
echo "Finished dumping training data for " . $this->getName() . ".\n";
|
||||
}
|
||||
|
||||
public function getHttpPort() : string
|
||||
{
|
||||
$port = $this->conf->getSectionItem($this->getName(), "http_port");
|
||||
if (!$port) {
|
||||
$port = $this->conf->getNextPort();
|
||||
$this->conf->setSectionItem($this->getName(), "http_port", $port);
|
||||
}
|
||||
|
||||
return $port;
|
||||
}
|
||||
|
||||
public function getHttpHost() : string
|
||||
{
|
||||
$host = $this->conf->getSectionItem($this->getName(), "http_host");
|
||||
if (!$host) {
|
||||
$srv = $this->conf->getSrv(
|
||||
$this->conf->getSectionItem($this->getName(), "srv_http")
|
||||
);
|
||||
if ($srv) {
|
||||
$host = $this->conf->getSectionItem($srv->getName(), "host");
|
||||
$this->conf->setSectionItem($this->getName(), "http_host", $host);
|
||||
}
|
||||
}
|
||||
|
||||
return $host;
|
||||
}
|
||||
|
||||
protected function getDbConf(string $item) : string
|
||||
{
|
||||
$val = $this->conf->getSectionItem($this->getName(), "db_$item");
|
||||
if (!$val) {
|
||||
$srv = $this->conf->getSrv(
|
||||
$this->conf->getSectionItem($this->getName(), "srv_db")
|
||||
);
|
||||
if ($srv) {
|
||||
$val = $this->conf->getSectionItem($srv->getName(), $item);
|
||||
$this->conf->setSectionItem($this->getName(), "db_$item", $val);
|
||||
}
|
||||
}
|
||||
|
||||
return $val;
|
||||
}
|
||||
|
||||
public function getDbPass() : string
|
||||
{
|
||||
return $this->getDbConf("pass");
|
||||
}
|
||||
|
||||
public function getDbUser() : string
|
||||
{
|
||||
return $this->getDbConf("user");
|
||||
}
|
||||
|
||||
public function getDbHost() : string
|
||||
{
|
||||
return $this->getDbConf("host");
|
||||
}
|
||||
|
||||
public function getDbPort() : string
|
||||
{
|
||||
return $this->getDbConf("port");
|
||||
}
|
||||
|
||||
public function httpStatusOk(int $status) : bool
|
||||
{
|
||||
$ok = array();
|
||||
|
||||
$ok = array_merge($ok, range(200, 206));
|
||||
$ok = array_merge($ok, range(300, 307));
|
||||
|
||||
return in_array($status, $ok);
|
||||
}
|
||||
|
||||
public function probeUrl(string $url) : bool
|
||||
{
|
||||
$ret = false;
|
||||
$c = curl_init($url);
|
||||
|
||||
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_exec($c);
|
||||
|
||||
if (!curl_errno($c)) {
|
||||
$st = curl_getinfo($c, CURLINFO_HTTP_CODE);
|
||||
$ret = $this->httpStatusOk((int)$st);
|
||||
}
|
||||
|
||||
curl_close($c);
|
||||
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
371
lib/php/libsdk/SDK/Build/PGO/Config.php
Normal file
371
lib/php/libsdk/SDK/Build/PGO/Config.php
Normal file
@@ -0,0 +1,371 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception};
|
||||
|
||||
class Config
|
||||
{
|
||||
const MODE_INIT = 0;
|
||||
const MODE_RUN = 1;
|
||||
const MODE_REINIT = 2; /* currently unused */
|
||||
const MODE_CHECK_INIT = 3;
|
||||
|
||||
protected $mode;
|
||||
protected $last_port = 8081;
|
||||
protected $sections = array();
|
||||
protected $scenario = "default";
|
||||
protected $tpl_vars = array();
|
||||
protected $srv = array();
|
||||
|
||||
public function __construct(int $mode = MODE_RUN)
|
||||
{
|
||||
if (self::MODE_CHECK_INIT == $mode) {
|
||||
// XXX The check is simple right now, so this is sufficient.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$this->isInitialized()) {
|
||||
$this->initWorkDir();
|
||||
}
|
||||
|
||||
if (self::MODE_REINIT == $mode) {
|
||||
$fn = $this->getWorkSectionsFilename();
|
||||
if (file_exists($fn)) {
|
||||
unlink($fn);
|
||||
}
|
||||
$mode = self::MODE_INIT;
|
||||
}
|
||||
|
||||
$this->mode = $mode;
|
||||
|
||||
|
||||
$base = getenv("PHP_SDK_ROOT_PATH");
|
||||
if (self::MODE_INIT == $mode) {
|
||||
foreach (array("nginx", "mariadb", "postgresql", "php") as $i) {
|
||||
$this->importSectionFromDir($i, $this->getTplDir() . DIRECTORY_SEPARATOR . $i);
|
||||
}
|
||||
} else if (self::MODE_RUN == $mode) {
|
||||
$fn = $this->getWorkSectionsFilename();
|
||||
if (!file_exists($fn)) {
|
||||
throw new Exception("Required config doesn't exist under '$fn'.");
|
||||
}
|
||||
$s = file_get_contents($fn);
|
||||
$this->sections = json_decode($s, true);
|
||||
foreach($this->sections as $k => $v) {
|
||||
$this->importTplVars($k, $v);
|
||||
}
|
||||
|
||||
} else {
|
||||
throw new Exception("Unknown config mode '$mode'.");
|
||||
}
|
||||
}
|
||||
|
||||
protected function initWorkDir() : void
|
||||
{
|
||||
if (!mkdir($this->getWorkDir())) {
|
||||
throw new Exception("Failed to create " . $this->getWorkDir());
|
||||
}
|
||||
}
|
||||
|
||||
public function isInitialized()
|
||||
{
|
||||
/* XXX Could be some better check. */
|
||||
return is_dir($this->getWorkDir());
|
||||
}
|
||||
|
||||
|
||||
public function getToolsDir() : string
|
||||
{
|
||||
$base = $this->getWorkDir();
|
||||
|
||||
return $base . DIRECTORY_SEPARATOR . "tools";
|
||||
}
|
||||
|
||||
public function getWorkDir() : string
|
||||
{
|
||||
$base = getenv("PHP_SDK_ROOT_PATH");
|
||||
|
||||
return $base . DIRECTORY_SEPARATOR . "pgo" . DIRECTORY_SEPARATOR . "work";
|
||||
}
|
||||
|
||||
public function getPkgCacheDir() : string
|
||||
{
|
||||
$base = $this->getWorkDir();
|
||||
|
||||
return $base . DIRECTORY_SEPARATOR . "package_cache";
|
||||
}
|
||||
|
||||
public function getJobDir(string $name = NULL) : string
|
||||
{
|
||||
$ret = $this->getWorkDir() . DIRECTORY_SEPARATOR . "job";
|
||||
|
||||
if ($name) {
|
||||
$ret .= DIRECTORY_SEPARATOR . $name;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function getSrvDir(string $name = NULL) : string
|
||||
{
|
||||
$ret = $this->getWorkDir() . DIRECTORY_SEPARATOR . "server";
|
||||
|
||||
if ($name) {
|
||||
$ret .= DIRECTORY_SEPARATOR . $name;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function getHtdocs(string $name = NULL) : string
|
||||
{
|
||||
$ret = $this->getWorkDir() . DIRECTORY_SEPARATOR . "htdocs";
|
||||
|
||||
if ($name) {
|
||||
$ret .= DIRECTORY_SEPARATOR . $name;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function getTplDir(string $name = NULL) : string
|
||||
{
|
||||
$ret = getenv("PHP_SDK_ROOT_PATH") . DIRECTORY_SEPARATOR . "pgo" . DIRECTORY_SEPARATOR . "tpl";
|
||||
|
||||
if ($name) {
|
||||
$ret .= DIRECTORY_SEPARATOR . $name;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function getCaseWorkDir(string $name = NULL) : string
|
||||
{
|
||||
$ret = $this->getWorkDir() . DIRECTORY_SEPARATOR . "htdocs";
|
||||
|
||||
if ($name) {
|
||||
$ret .= DIRECTORY_SEPARATOR . $name;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function getCasesTplDir(string $name = NULL) : string
|
||||
{
|
||||
$ret = getenv("PHP_SDK_ROOT_PATH") . DIRECTORY_SEPARATOR . "pgo" . DIRECTORY_SEPARATOR . "cases";
|
||||
|
||||
if ($name) {
|
||||
$ret .= DIRECTORY_SEPARATOR . $name;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function sectionItemExists(...$args) : bool
|
||||
{
|
||||
$i = 0;
|
||||
$k = strtolower($args[$i]);
|
||||
$it = $this->sections;
|
||||
|
||||
while (array_key_exists($k, $it)) {
|
||||
$it = $it[$k];
|
||||
|
||||
if (++$i >= count($args)) break;
|
||||
|
||||
$k = strtolower($args[$i]);
|
||||
}
|
||||
|
||||
return $i == count($args);
|
||||
}
|
||||
|
||||
public function getSectionItem(...$args)
|
||||
{
|
||||
$i = 0;
|
||||
$k = strtolower($args[$i]);
|
||||
$it = $this->sections;
|
||||
|
||||
while (array_key_exists($k, $it)) {
|
||||
$it = $it[$k];
|
||||
|
||||
if (++$i >= count($args)) break;
|
||||
|
||||
$k = strtolower($args[$i]);
|
||||
}
|
||||
|
||||
if ($i != count($args)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return $it;
|
||||
}
|
||||
|
||||
public function setSectionItem(...$args) : void
|
||||
{
|
||||
$val = array_pop($args);
|
||||
|
||||
$i = 0;
|
||||
$k = strtolower($args[$i]);
|
||||
$it = &$this->sections;
|
||||
|
||||
while (true) {
|
||||
$it = &$it[$k];
|
||||
if (++$i >= count($args)) break;
|
||||
$k = strtolower($args[$i]);
|
||||
}
|
||||
|
||||
$it = $val;
|
||||
|
||||
$this->syncTplVars();
|
||||
$this->dump();
|
||||
}
|
||||
|
||||
public function importSectionFromDir(string $name, string $dir) : void
|
||||
{
|
||||
$fn = $dir . DIRECTORY_SEPARATOR . "phpsdk_pgo.json";
|
||||
if (!file_exists($fn)) {
|
||||
throw new Exception("Couldn't import section, file '$fn' doesn't exist.");
|
||||
}
|
||||
|
||||
$s = file_get_contents($fn);
|
||||
$this->setSectionItem($name, json_decode($s, true));
|
||||
}
|
||||
|
||||
protected function syncTplVars() : void
|
||||
{
|
||||
$this->tpl_vars = array();
|
||||
foreach ($this->sections as $k => $v) {
|
||||
$this->importTplVars($k, $v);
|
||||
}
|
||||
}
|
||||
|
||||
public function buildTplVarName(...$args) : string
|
||||
{
|
||||
$tpl_k = array("PHP_SDK_PGO");
|
||||
|
||||
foreach ($args as $a) {
|
||||
$tpl_k[] = strtoupper($a);
|
||||
}
|
||||
|
||||
return implode("_", $tpl_k);
|
||||
}
|
||||
|
||||
protected function importTplVars(string $section_name, array $section) : void
|
||||
{
|
||||
foreach($section as $k0 => $v0) {
|
||||
|
||||
if (is_array($v0)) {
|
||||
if (substr($k0, -4) == ":env") {
|
||||
/* Don't put env vars as tpl vars for now. */
|
||||
continue;
|
||||
}
|
||||
$this->importTplVars($section_name . "_" . $k0, $v0);
|
||||
} else {
|
||||
$tpl_k = $this->buildTplVarName($section_name, $k0);
|
||||
$this->tpl_vars[$tpl_k] = $v0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function processTpl(string $s, array $additional_vars = array()) : string
|
||||
{
|
||||
$vars = array_merge($this->tpl_vars, $additional_vars);
|
||||
|
||||
$s = str_replace(array_keys($vars), array_values($vars), $s);
|
||||
|
||||
return $s;
|
||||
}
|
||||
|
||||
public function processTplFile(string $tpl_fn, string $dst_fn, array $additional_vars = array()) : void
|
||||
{
|
||||
if (!file_exists($tpl_fn)) {
|
||||
throw new Exception("Template file '$fn' doesn't exist.");
|
||||
}
|
||||
|
||||
$s = file_get_contents($tpl_fn);
|
||||
if (false === $s) {
|
||||
throw new Exception("Couldn't read '$tpl_fn'.");
|
||||
}
|
||||
|
||||
$s = $this->processTpl($s, $additional_vars);
|
||||
|
||||
if (false === file_put_contents($dst_fn, $s)) {
|
||||
throw new Exception("Failed to write '$dst_fn'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function getWorkSectionsFilename()
|
||||
{
|
||||
return $this->getWorkDir() . DIRECTORY_SEPARATOR . "phpsdk_pgo.json";
|
||||
}
|
||||
|
||||
public function dump(string $fn = NULL) : void
|
||||
{
|
||||
$fn = $fn ? $fn : $this->getWorkSectionsFilename();
|
||||
|
||||
$s = json_encode($this->sections, JSON_PRETTY_PRINT);
|
||||
|
||||
$ret = file_put_contents($fn, $s);
|
||||
if (false === $ret || strlen($s) !== $ret) {
|
||||
throw new Exception("Errors with writing to '$fn'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function setScenario(string $scenario) : void
|
||||
{
|
||||
if (!in_array($scenario, array("default", "cache"), true)) {
|
||||
throw new Exception("Unknown scenario '$scenario'.");
|
||||
}
|
||||
$this->scenario = $scenario;
|
||||
}
|
||||
|
||||
public function getScenario() : string
|
||||
{
|
||||
return $this->scenario;
|
||||
}
|
||||
|
||||
public function getNextPort() : int
|
||||
{
|
||||
return ++$this->last_port;
|
||||
}
|
||||
|
||||
public function setLastPort(int $port) : void
|
||||
{
|
||||
$this->last_port = $port;
|
||||
}
|
||||
|
||||
public function getSdkPhpCmd() : string
|
||||
{
|
||||
return getenv("PHP_SDK_PHP_CMD");
|
||||
}
|
||||
|
||||
public function addSrv($item) : void
|
||||
{
|
||||
$name = strtolower($item->getName());
|
||||
|
||||
if (isset($this->srv[$name])) {
|
||||
throw new Exception("Server '$name' already exists.");
|
||||
}
|
||||
|
||||
/* XXX Additional checks could not harm. */
|
||||
$this->srv[$name] = $item;
|
||||
}
|
||||
|
||||
public function getSrv(?string $name = NULL)
|
||||
{
|
||||
$ret = NULL;
|
||||
|
||||
$name = strtolower($name);
|
||||
|
||||
if (!$name) {
|
||||
return NULL;
|
||||
} else if ("all" == $name) {
|
||||
return $this->srv;
|
||||
} else if (isset($this->srv[$name])) {
|
||||
return $this->srv[$name];
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
256
lib/php/libsdk/SDK/Build/PGO/Controller.php
Normal file
256
lib/php/libsdk/SDK/Build/PGO/Controller.php
Normal file
@@ -0,0 +1,256 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception, Lock};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\Build\PGO\Server\{MariaDB, NGINX, PostgreSQL};
|
||||
use SDK\Build\PGO\PHP;
|
||||
use SDK\Build\PGO\Tool\{PGO, PackageWorkman};
|
||||
use SDK\Build\PGO\Interfaces\TrainingCase;
|
||||
use SDK\Build\PGO\TrainingCaseIterator;
|
||||
|
||||
/* TODO add bench action */
|
||||
|
||||
class Controller
|
||||
{
|
||||
protected $cmd;
|
||||
protected $scenario;
|
||||
protected $conf;
|
||||
|
||||
public function __construct(string $cmd, ?string $scenario)
|
||||
{
|
||||
$this->cmd = $cmd;
|
||||
|
||||
if (NULL == $scenario) {
|
||||
$scenario = "default";
|
||||
}
|
||||
$this->scenario = $scenario;
|
||||
}
|
||||
|
||||
protected function vitalizeSrv()
|
||||
{
|
||||
$all = $this->conf->getSrv("all");
|
||||
|
||||
if (empty($all)) {
|
||||
$php_fcgi_tcp = new PHP\FCGI($this->conf, true);
|
||||
$this->conf->addSrv(new NGINX($this->conf, $php_fcgi_tcp));
|
||||
|
||||
$this->conf->addSrv(new MariaDB($this->conf));
|
||||
/* Uncomment to enable PostgreSQL*/
|
||||
/* $this->conf->addSrv(new PostgreSQL($this->conf));*/
|
||||
|
||||
$all = $this->conf->getSrv("all");
|
||||
}
|
||||
|
||||
return $all;
|
||||
}
|
||||
|
||||
protected function setupConfig($cmd)
|
||||
{
|
||||
switch ($cmd) {
|
||||
default:
|
||||
throw new Exception("Unknown action '{$cmd}'.");
|
||||
break;
|
||||
case "check_init":
|
||||
$cnf = new PGOConfig(PGOConfig::MODE_CHECK_INIT);
|
||||
break;
|
||||
case "init":
|
||||
$cnf = new PGOConfig(PGOConfig::MODE_INIT);
|
||||
break;
|
||||
case "train":
|
||||
case "up":
|
||||
case "down":
|
||||
$cnf = new PGOConfig(PGOConfig::MODE_RUN);
|
||||
}
|
||||
$cnf->setScenario($this->scenario);
|
||||
|
||||
return $cnf;
|
||||
}
|
||||
|
||||
public function handle($force)
|
||||
{
|
||||
/*$mode = (int)("init" !== $this->cmd);
|
||||
$mode = (PGOConfig::MODE_INIT == $mode && $force) ? PGOConfig::MODE_REINIT : $mode;
|
||||
$this->conf = new PGOConfig("init" !== $this->cmd);
|
||||
$this->conf->setScenario($this->scenario);*/
|
||||
$this->conf = $this->setupConfig($this->cmd);
|
||||
|
||||
switch ($this->cmd) {
|
||||
default:
|
||||
throw new Exception("Unknown action '{$this->cmd}'.");
|
||||
break;
|
||||
case "init":
|
||||
$lk = new Lock("pgo_init");
|
||||
if (!$lk->locked()) {
|
||||
echo "Another process runs initialization right now, waiting.", PHP_EOL;
|
||||
$lk->exclusive(true);
|
||||
echo "Another process finished running initialization, I quit as well.", PHP_EOL;
|
||||
return;
|
||||
}
|
||||
$this->init($force);
|
||||
break;
|
||||
case "train":
|
||||
$lk = new Lock("pgo_train");
|
||||
if (!$lk->locked()) {
|
||||
echo "Another process runs training right now, I have to wait.", PHP_EOL;
|
||||
$lk->exclusive(true);
|
||||
echo "Another process finished training, I may continue.", PHP_EOL;
|
||||
}
|
||||
$this->train();
|
||||
break;
|
||||
case "up":
|
||||
$this->up();
|
||||
break;
|
||||
|
||||
case "down":
|
||||
$this->down($force);
|
||||
break;
|
||||
case "check_init":
|
||||
// pass
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected function initWorkDirs() : void
|
||||
{
|
||||
$dirs = array(
|
||||
$this->conf->getSrvDir(),
|
||||
$this->conf->getToolsDir(),
|
||||
$this->conf->getHtdocs(),
|
||||
$this->conf->getJobDir(),
|
||||
$this->conf->getPkgCacheDir(),
|
||||
);
|
||||
|
||||
foreach ($dirs as $dir) {
|
||||
if (!is_dir($dir)) {
|
||||
if (!mkdir($dir)) {
|
||||
throw new Exception("Failed to create '$dir'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function prepareStandaloneTools(PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$php = new PHP\CLI($this->conf);
|
||||
|
||||
$composer = $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "composer.phar";
|
||||
if (!file_exists($composer) || $force) {
|
||||
/* XXX this needs to go into the config, specifically for composer maybe even separate class. */
|
||||
$url = "https://getcomposer.org/installer";
|
||||
$tool = $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "composer-setup.php";
|
||||
$pw->fetch($url, $tool, $force);
|
||||
$php->exec("$tool --install-dir=" . $this->conf->getToolsDir());
|
||||
unlink($tool);
|
||||
}
|
||||
}
|
||||
|
||||
public function init(bool $force = false)
|
||||
{
|
||||
echo "\nInitializing PGO training environment.\n\n";
|
||||
|
||||
$this->initWorkDirs();
|
||||
|
||||
$pw = new PackageWorkman($this->conf);
|
||||
|
||||
$this->prepareStandaloneTools($pw, $force);
|
||||
|
||||
$srvs = $this->vitalizeSrv();
|
||||
foreach ($srvs as $srv) {
|
||||
$srv->prepareInit($pw, $force);
|
||||
}
|
||||
|
||||
foreach (new TrainingCaseIterator($this->conf) as $handler) {
|
||||
$handler->prepareInit($pw, $force);
|
||||
}
|
||||
|
||||
foreach ($srvs as $srv) {
|
||||
$srv->init();
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
echo "\n";
|
||||
foreach (new TrainingCaseIterator($this->conf) as $handler) {
|
||||
$handler->init();
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
echo "PGO training environment Initialization complete.\n";
|
||||
}
|
||||
|
||||
public function isInitialized()
|
||||
{
|
||||
return $this->conf->isinitialized();
|
||||
}
|
||||
|
||||
public function train()
|
||||
{
|
||||
if (!$this->isInitialized()) {
|
||||
throw new Exception("PGO training environment is not initialized.");
|
||||
}
|
||||
|
||||
echo "\nStarting PGO training using scenario '{$this->scenario}'.\n\n";
|
||||
$this->up();
|
||||
|
||||
/* Clean the PGO db files, only needed once.
|
||||
Imply also, that any data created during init or
|
||||
startup is wasted. It is done by dumpbing the data
|
||||
from the current running processes and subsequently
|
||||
removing the files. */
|
||||
$php = $this->conf->getSrv("nginx")->getPhp();
|
||||
$pgo = new PGO($this->conf, $php);
|
||||
$pgo->waste();
|
||||
$pgo->clean();
|
||||
unset($pgo);
|
||||
|
||||
foreach (new TrainingCaseIterator($this->conf) as $handler) {
|
||||
echo "\n";
|
||||
$handler->run();
|
||||
}
|
||||
|
||||
/* All the PGC files are merged, simply clean them out. */
|
||||
$pgo = new PGO($this->conf, $php);
|
||||
$pgo->clean(true, false);
|
||||
unset($pgo);
|
||||
|
||||
$this->down();
|
||||
echo "PGO training complete.\n";
|
||||
}
|
||||
|
||||
public function up()
|
||||
{
|
||||
|
||||
if (!$this->isInitialized()) {
|
||||
throw new Exception("PGO training environment is not initialized.");
|
||||
}
|
||||
echo "\nStarting up PGO environment.\n\n";
|
||||
|
||||
foreach ($this->vitalizeSrv("all") as $srv) {
|
||||
$srv->up();
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
sleep(1);
|
||||
|
||||
echo "The PGO environment is up.\n";
|
||||
}
|
||||
|
||||
public function down(bool $force = false)
|
||||
{
|
||||
if (!$this->isInitialized()) {
|
||||
throw new Exception("PGO training environment is not initialized.");
|
||||
}
|
||||
/* XXX check it was started of course. */
|
||||
echo "\nShutting down PGO environment.\n\n";
|
||||
|
||||
foreach ($this->vitalizeSrv("all") as $srv) {
|
||||
$srv->down($force);
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
sleep(1);
|
||||
|
||||
echo "The PGO environment has been shut down.\n";
|
||||
}
|
||||
}
|
||||
18
lib/php/libsdk/SDK/Build/PGO/Interfaces/PHP.php
Normal file
18
lib/php/libsdk/SDK/Build/PGO/Interfaces/PHP.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Interfaces;
|
||||
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
interface PHP
|
||||
{
|
||||
/* Prepare anything necessary to start initialization, like fetch required packages, etc. */
|
||||
public function prepareInit(PackageWorkman $pw, bool $force = false) : void;
|
||||
public function init() : void;
|
||||
public function up() : void;
|
||||
public function down(bool $force = false) : void;
|
||||
public function getVersion(bool $short = false) : string;
|
||||
public function getExeFilename() : string;
|
||||
}
|
||||
|
||||
17
lib/php/libsdk/SDK/Build/PGO/Interfaces/Server.php
Normal file
17
lib/php/libsdk/SDK/Build/PGO/Interfaces/Server.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Interfaces;
|
||||
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
interface Server
|
||||
{
|
||||
/* Prepare anything necessary to start initialization, like fetch required packages, etc. */
|
||||
public function prepareInit(PackageWorkman $pw, bool $force = false) : void;
|
||||
public function init() : void;
|
||||
public function up() : void;
|
||||
public function down(bool $force = false) : void;
|
||||
public function getName() : string;
|
||||
}
|
||||
|
||||
13
lib/php/libsdk/SDK/Build/PGO/Interfaces/Server/DB.php
Normal file
13
lib/php/libsdk/SDK/Build/PGO/Interfaces/Server/DB.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Interfaces\Server;
|
||||
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
|
||||
interface DB extends Interfaces\Server
|
||||
{
|
||||
public function __construct(Config $conf);
|
||||
public function query(string $s, string $db = NULL) : void;
|
||||
}
|
||||
|
||||
14
lib/php/libsdk/SDK/Build/PGO/Interfaces/Server/HTTP.php
Normal file
14
lib/php/libsdk/SDK/Build/PGO/Interfaces/Server/HTTP.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Interfaces\Server;
|
||||
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
|
||||
interface HTTP extends Interfaces\Server
|
||||
{
|
||||
public function __construct(Config $conf, Interfaces\PHP $php);
|
||||
public function getPhp() : Interfaces\PHP;
|
||||
public function addServer(string $part_tpl_fn, array $tpl_vars = array());
|
||||
}
|
||||
|
||||
28
lib/php/libsdk/SDK/Build/PGO/Interfaces/TrainingCase.php
Normal file
28
lib/php/libsdk/SDK/Build/PGO/Interfaces/TrainingCase.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Interfaces;
|
||||
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
|
||||
interface TrainingCase
|
||||
{
|
||||
public function __construct(PGOConfig $conf, ?Server $srv_http, ?Server\DB $srv_db);
|
||||
|
||||
/* Name of the training case, usually should be same as dirname and namespace. */
|
||||
public function getName() : string;
|
||||
|
||||
/* Prepare anything necessary to start initialization, like fetch required packages, etc. */
|
||||
public function prepareInit(PackageWorkman $pw, bool $force = false) : void;
|
||||
|
||||
/* Initialize the case, run only once on a new checkout. */
|
||||
public function init() : void;
|
||||
|
||||
/* Run training. */
|
||||
public function run() : void;
|
||||
|
||||
/* Get training type, it's like "web", "cli", etc.*/
|
||||
public function getType() : string;
|
||||
}
|
||||
|
||||
0
lib/php/libsdk/SDK/Build/PGO/PHP/Apache.php
Normal file
0
lib/php/libsdk/SDK/Build/PGO/PHP/Apache.php
Normal file
56
lib/php/libsdk/SDK/Build/PGO/PHP/CLI.php
Normal file
56
lib/php/libsdk/SDK/Build/PGO/PHP/CLI.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\PHP;
|
||||
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class CLI extends Abstracts\PHP implements Interfaces\PHP
|
||||
{
|
||||
protected $conf;
|
||||
|
||||
public function __construct(PGOConfig $conf)
|
||||
{
|
||||
$this->conf = $conf;
|
||||
$this->scenario = $conf->getScenario();
|
||||
|
||||
$this->setupPaths();
|
||||
}
|
||||
|
||||
public function prepareInit(PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
/* pass */
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
/* pass */
|
||||
}
|
||||
|
||||
public function up() : void
|
||||
{
|
||||
/* pass */
|
||||
}
|
||||
|
||||
public function down(bool $force = false) : void
|
||||
{
|
||||
/* pass */
|
||||
}
|
||||
|
||||
public function getExeFilename() : string
|
||||
{
|
||||
$exe = $this->getRootDir() . DIRECTORY_SEPARATOR . "php.exe";
|
||||
|
||||
if (!file_exists($exe)) {
|
||||
throw new Exception("Path '$exe' doesn't exist.");
|
||||
}
|
||||
|
||||
return $exe;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
105
lib/php/libsdk/SDK/Build/PGO/PHP/FCGI.php
Normal file
105
lib/php/libsdk/SDK/Build/PGO/PHP/FCGI.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\PHP;
|
||||
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class FCGI extends Abstracts\PHP implements Interfaces\PHP
|
||||
{
|
||||
protected $conf;
|
||||
protected $is_tcp;
|
||||
|
||||
public function __construct(PGOConfig $conf, bool $is_tcp)
|
||||
{
|
||||
if (!$is_tcp) {
|
||||
throw new Exception("FCGI training other than through TCP is not implemented yet.");
|
||||
}
|
||||
|
||||
$this->conf = $conf;
|
||||
$this->is_tcp = $is_tcp;
|
||||
$this->scenario = $conf->getScenario();
|
||||
|
||||
$this->setupPaths();
|
||||
}
|
||||
|
||||
public function getExeFilename() : string
|
||||
{
|
||||
$exe = $this->getRootDir() . DIRECTORY_SEPARATOR . "php-cgi.exe";
|
||||
|
||||
if (!file_exists($exe)) {
|
||||
throw new Exception("Path '$exe' doesn't exist.");
|
||||
}
|
||||
|
||||
return $exe;
|
||||
}
|
||||
|
||||
protected function createEnv() : array
|
||||
{
|
||||
$env = parent::createEnv();
|
||||
|
||||
$fcgi_env = (array)$this->conf->getSectionItem("php", "fcgi:env");
|
||||
|
||||
foreach ($fcgi_env as $k => $v) {
|
||||
$env[$k] = $v;
|
||||
}
|
||||
|
||||
return $env;
|
||||
}
|
||||
|
||||
public function prepareInit(PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
/* echo "Initializing PHP FCGI.\n";
|
||||
echo "PHP FCGI initialization done.\n";*/
|
||||
}
|
||||
|
||||
public function up() : void
|
||||
{
|
||||
echo "Starting PHP FCGI.\n";
|
||||
|
||||
$exe = $this->getExeFilename();
|
||||
$ini = $this->getIniFilename();
|
||||
$host = $this->conf->getSectionItem("php", "fcgi", "host");
|
||||
$port = $this->conf->getSectionItem("php", "fcgi", "port");
|
||||
|
||||
$cmd = "start /b $exe -n -c $ini -b $host:$port 2>&1";
|
||||
|
||||
$desc = array(
|
||||
0 => array("file", "php://stdin", "r"),
|
||||
1 => array("file", "php://stdout", "w"),
|
||||
2 => array("file", "php://stderr", "w"),
|
||||
);
|
||||
|
||||
$p = proc_open($cmd, $desc, $pipes, $this->getRootDir(), $this->createEnv());
|
||||
|
||||
/* Give some time, it might be slow on PGI enabled proc. */
|
||||
sleep(3);
|
||||
|
||||
$c = proc_close($p);
|
||||
|
||||
if ($c) {
|
||||
throw new Exception("PHP FCGI process exited with code '$c'.");
|
||||
}
|
||||
|
||||
/* XXX for Opcache, setup also file cache. */
|
||||
|
||||
echo "PHP FCGI started.\n";
|
||||
}
|
||||
|
||||
public function down(bool $force = false) : void
|
||||
{
|
||||
echo "Stopping PHP FCGI.\n";
|
||||
|
||||
exec("taskkill /f /im php-cgi.exe >nul 2>&1");
|
||||
|
||||
echo "PHP FCGI stopped.\n";
|
||||
}
|
||||
}
|
||||
|
||||
144
lib/php/libsdk/SDK/Build/PGO/Server/MariaDB.php
Normal file
144
lib/php/libsdk/SDK/Build/PGO/Server/MariaDB.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Server;
|
||||
|
||||
use SDK\Build\PGO\Interfaces\Server\DB;
|
||||
use SDK\Build\PGO\Abstracts\Server;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class MariaDB extends Server implements DB
|
||||
{
|
||||
use FileOps;
|
||||
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $name = "MariaDB";
|
||||
|
||||
public function __construct(PGOConfig $conf)
|
||||
{
|
||||
$this->conf = $conf;
|
||||
$this->base = $conf->getSrvDir(strtolower($this->name));
|
||||
}
|
||||
|
||||
protected function setupDist()
|
||||
{
|
||||
/* pass */
|
||||
}
|
||||
|
||||
public function prepareInit(PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$url = $this->conf->getSectionItem($this->name, "pkg_url");
|
||||
$pw->fetchAndUnzip($url, "mariadb.zip", $this->conf->getSrvDir(), "mariadb", $force);
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->name . ".\n";
|
||||
|
||||
$this->setupDist();
|
||||
|
||||
$this->up();
|
||||
$this->down(true);
|
||||
|
||||
echo $this->name . " initialization done.\n";
|
||||
}
|
||||
|
||||
public function up() : void
|
||||
{
|
||||
echo "Starting " . $this->name . ".\n";
|
||||
|
||||
$cwd = getcwd();
|
||||
|
||||
chdir($this->base);
|
||||
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
//$h = popen("start /b .\\bin\\mysqld.exe --port=$port >nul 2>&1", "r");
|
||||
$h = popen("start /b .\\bin\\mysqld.exe --port=$port 2>&1", "r");
|
||||
|
||||
if (!is_resource($h)) {
|
||||
chdir($cwd);
|
||||
throw new Exception("Failed to start MariaDB.");
|
||||
}
|
||||
sleep(3);
|
||||
|
||||
while (!feof($h)) {
|
||||
echo fread($h, 1024);
|
||||
}
|
||||
pclose($h);
|
||||
|
||||
chdir($cwd);
|
||||
|
||||
echo $this->name . " started.\n";
|
||||
}
|
||||
|
||||
public function down(bool $force = false) : void
|
||||
{
|
||||
echo "Stopping " . $this->name . ".\n";
|
||||
|
||||
$cwd = getcwd();
|
||||
|
||||
chdir($this->base);
|
||||
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$cmd = sprintf(".\\bin\\mysqladmin.exe --host=$host --port=$port -u $user %s--shutdown_timeout=0 shutdown", ($pass ? "-p$pass " : ""));
|
||||
exec($cmd);
|
||||
|
||||
if ($force) {
|
||||
sleep(1);
|
||||
exec("taskkill /f /im mysqld.exe >nul 2>&1");
|
||||
}
|
||||
|
||||
chdir($cwd);
|
||||
|
||||
echo $this->name . " stopped.\n";
|
||||
}
|
||||
|
||||
public function query(string $s, string $db = NULL) : void
|
||||
{
|
||||
$ret = NULL;
|
||||
|
||||
$cwd = getcwd();
|
||||
|
||||
chdir($this->base);
|
||||
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$pass_arg = $pass ? "-p$pass " : "";
|
||||
$db_arg = $db ? "-D $db" : "";
|
||||
$ret = shell_exec(".\\bin\\mysql.exe -u $user $pass_arg -h $host -P $port $db_arg -e \"$s\"");
|
||||
//var_dump($this->base, getcwd(), ".\\bin\\mysql.exe -u $user $pass_arg -h $host -P $port -e \"$s\"");
|
||||
|
||||
chdir($cwd);
|
||||
}
|
||||
|
||||
public function import(string $path, string $db = NULL) : void
|
||||
{
|
||||
$ret = NULL;
|
||||
|
||||
$cwd = getcwd();
|
||||
|
||||
chdir($this->base);
|
||||
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$pass_arg = $pass ? "-p$pass " : "";
|
||||
$db_arg = $db ? "-D $db" : "";
|
||||
$ret = shell_exec(".\\bin\\mysql.exe -u $user $pass_arg -h $host -P $port $db_arg < \"$path\"");
|
||||
|
||||
chdir($cwd);
|
||||
}
|
||||
}
|
||||
|
||||
151
lib/php/libsdk/SDK/Build/PGO/Server/NGINX.php
Normal file
151
lib/php/libsdk/SDK/Build/PGO/Server/NGINX.php
Normal file
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Server;
|
||||
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\{Config as PGOConfig};
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class NGINX extends Abstracts\Server implements Interfaces\Server\HTTP
|
||||
{
|
||||
use FileOps;
|
||||
|
||||
protected $name = "NGINX";
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $php;
|
||||
|
||||
public function __construct(PGOConfig $conf, Interfaces\PHP $php)
|
||||
{
|
||||
$this->conf = $conf;
|
||||
$this->base = $conf->getSrvDir(strtolower($this->name));
|
||||
$this->php = $php;
|
||||
}
|
||||
|
||||
protected function setupDist() : void
|
||||
{
|
||||
$nginx_conf_in = $this->conf->getTplDir($this->name) . DIRECTORY_SEPARATOR . "nginx.conf";
|
||||
$conf_fn = $this->base . DIRECTORY_SEPARATOR . "conf" . DIRECTORY_SEPARATOR . "nginx.conf";
|
||||
|
||||
$vars = array();
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
if (!$port) {
|
||||
$port = $this->conf->getNextPort();
|
||||
$this->conf->setSectionItem($this->name, "port", $port);
|
||||
}
|
||||
|
||||
$vars = array(
|
||||
$this->conf->buildTplVarName($this->name, "docroot") => str_replace("\\", "/", $this->base . DIRECTORY_SEPARATOR . "html"),
|
||||
);
|
||||
|
||||
$this->conf->processTplFile(
|
||||
$nginx_conf_in,
|
||||
$conf_fn,
|
||||
$vars
|
||||
);
|
||||
}
|
||||
|
||||
public function prepareInit(PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$url = $this->conf->getSectionItem($this->name, "pkg_url");
|
||||
$pw->fetchAndUnzip($url, "nginx.zip", $this->conf->getSrvDir(), "nginx", $force);
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->name . ".\n";
|
||||
|
||||
$this->setupDist();
|
||||
|
||||
$this->upMe();
|
||||
$this->downMe(true);
|
||||
|
||||
|
||||
echo $this->name . " initialization done.\n";
|
||||
}
|
||||
|
||||
protected function upMe() : void
|
||||
{
|
||||
echo "Starting " . $this->name . ".\n";
|
||||
|
||||
$cwd = getcwd();
|
||||
|
||||
chdir($this->base);
|
||||
|
||||
$h = popen("start /b .\\nginx.exe 2>&1", "r");
|
||||
if (!is_resource($h)) {
|
||||
chdir($cwd);
|
||||
throw new Exception("Failed to start MariaDB.");
|
||||
}
|
||||
sleep(3);
|
||||
|
||||
/* while (!feof($h)) {
|
||||
echo fread($h, 1024);
|
||||
}*/
|
||||
|
||||
pclose($h);
|
||||
|
||||
chdir($cwd);
|
||||
|
||||
echo $this->name . " started.\n";
|
||||
}
|
||||
|
||||
public function up() : void
|
||||
{
|
||||
|
||||
$this->php->up();
|
||||
$this->upMe();
|
||||
}
|
||||
|
||||
public function downMe(bool $force = false) : void
|
||||
{
|
||||
echo "Stopping " . $this->name . ".\n";
|
||||
|
||||
$cwd = getcwd();
|
||||
|
||||
chdir($this->base);
|
||||
|
||||
exec(".\\nginx.exe -s quit");
|
||||
|
||||
if ($force) {
|
||||
sleep(1);
|
||||
exec("taskkill /f /im nginx.exe >nul 2>&1");
|
||||
}
|
||||
|
||||
chdir($cwd);
|
||||
|
||||
echo $this->name . " stopped.\n";
|
||||
}
|
||||
|
||||
public function down(bool $force = false) : void
|
||||
{
|
||||
$this->php->down();
|
||||
$this->downMe($force);
|
||||
}
|
||||
|
||||
/* Use only for init phase! */
|
||||
public function addServer(string $part_tpl_fn, array $tpl_vars = array())
|
||||
{
|
||||
if (!file_exists($part_tpl_fn)) {
|
||||
throw new Exception("Template file '$part_tpl_fn' doesn't exist.");
|
||||
}
|
||||
|
||||
/* We've already did a fresh (re)config, so use the work file now. */
|
||||
$nginx_conf_in = $this->base . DIRECTORY_SEPARATOR . "conf" . DIRECTORY_SEPARATOR . "nginx.conf";
|
||||
$cur_conf = file_get_contents($nginx_conf_in);
|
||||
|
||||
$in = file_get_contents($part_tpl_fn);
|
||||
$out = $this->conf->processTpl($in, $tpl_vars);
|
||||
|
||||
$tpl = " # PHP_SDK_PGO_NGINX_SERVERS_INC_TPL";
|
||||
$new_conf = str_replace($tpl, "$out\n$tpl", $cur_conf);
|
||||
|
||||
$conf_fn = $this->base . DIRECTORY_SEPARATOR . "conf" . DIRECTORY_SEPARATOR . "nginx.conf";
|
||||
if (!file_put_contents($conf_fn, $new_conf)) {
|
||||
throw new Exception("Couldn't write '$conf_fn'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
144
lib/php/libsdk/SDK/Build/PGO/Server/PostgreSQL.php
Normal file
144
lib/php/libsdk/SDK/Build/PGO/Server/PostgreSQL.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Server;
|
||||
|
||||
use SDK\Build\PGO\Interfaces\Server\DB;
|
||||
use SDK\Build\PGO\Abstracts\Server;
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool\PackageWorkman;
|
||||
|
||||
class PostgreSQL extends Server implements DB
|
||||
{
|
||||
use FileOps;
|
||||
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $data_dir;
|
||||
protected $name = "PostgreSQL";
|
||||
|
||||
public function __construct(PGOConfig $conf)
|
||||
{
|
||||
$this->conf = $conf;
|
||||
$this->base = $conf->getSrvDir(strtolower($this->name));
|
||||
$this->data_dir = $this->base . DIRECTORY_SEPARATOR . "data";
|
||||
}
|
||||
|
||||
protected function setupDist()
|
||||
{
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
if (!$user) {
|
||||
$user = trim(shell_exec("pwgen -1 -s 8"));
|
||||
$this->conf->setSectionItem($this->getName(), "user", $user);
|
||||
}
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
if (!$pass) {
|
||||
$pass = trim(shell_exec("pwgen -1 -s 8"));
|
||||
$this->conf->setSectionItem($this->getName(), "pass", $pass);
|
||||
}
|
||||
|
||||
if (!is_dir($this->data_dir)) {
|
||||
$pwfile = tempnam(sys_get_temp_dir(), "tmp");
|
||||
if (strlen($pass) !== file_put_contents($pwfile, $pass)) {
|
||||
throw new Exception("Couldn't write '$pwfile'.");
|
||||
}
|
||||
$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "initdb.exe --auth=trust --nosync --username=$user --pwfile=$pwfile --encoding=UTF8 " . $this->data_dir;
|
||||
//$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "initdb.exe --auth=trust --nosync --username=$user --encoding=UTF8 " . $this->data_dir;
|
||||
/*echo "$cmd\n";
|
||||
echo file_get_contents($pwfile) . "\n";*/
|
||||
exec($cmd);
|
||||
unlink($pwfile);
|
||||
}
|
||||
}
|
||||
|
||||
public function prepareInit(PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$url = $this->conf->getSectionItem($this->name, "pkg_url");
|
||||
$pw->fetchAndUnzip($url, "postgresql.zip", $this->conf->getSrvDir(), "postgresql", $force);
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->name . ".\n";
|
||||
|
||||
$this->setupDist();
|
||||
|
||||
$this->up();
|
||||
$this->down(true);
|
||||
|
||||
echo $this->name . " initialization done.\n";
|
||||
}
|
||||
|
||||
public function up() : void
|
||||
{
|
||||
echo "Starting " . $this->name . ".\n";
|
||||
|
||||
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "pg_ctl.exe start -D " . $this->data_dir . " -o \"-h $host -p $port\"";
|
||||
$h = popen($cmd, "r");
|
||||
/* XXX error check*/
|
||||
pclose($h);
|
||||
|
||||
echo $this->name . " started.\n";
|
||||
}
|
||||
|
||||
public function down(bool $force = false) : void
|
||||
{
|
||||
echo "Stopping " . $this->name . ".\n";
|
||||
|
||||
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
|
||||
|
||||
$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "pg_ctl.exe stop -D " . $this->data_dir . " -m fast";
|
||||
exec($cmd);
|
||||
|
||||
if ($force) {
|
||||
//sleep(1);
|
||||
//exec("taskkill /f /im nginx.exe >nul 2>&1");
|
||||
}
|
||||
|
||||
echo $this->name . " stopped.\n";
|
||||
}
|
||||
|
||||
public function createDb(string $db_name) : void
|
||||
{
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "createdb.exe -h $host -p $port -U $user $db_name";
|
||||
exec($cmd);
|
||||
}
|
||||
|
||||
public function dropDb(string $db_name) : void
|
||||
{
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
//$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "dropdb.exe --if-exists -h $host -p $port -U $user $db_name";
|
||||
exec($cmd);
|
||||
}
|
||||
|
||||
public function query(string $s, string $db = NULL) : void
|
||||
{
|
||||
$ret = NULL;
|
||||
|
||||
$user = $this->conf->getSectionItem($this->name, "user");
|
||||
//$pass = $this->conf->getSectionItem($this->name, "pass");
|
||||
$host = $this->conf->getSectionItem($this->name, "host");
|
||||
$port = $this->conf->getSectionItem($this->name, "port");
|
||||
|
||||
$db_arg = $db ? "-d $db" : "";
|
||||
$cmd = $this->base . DIRECTORY_SEPARATOR . "bin" . DIRECTORY_SEPARATOR . "psql.exe -h $host -p $port -U $user $db_arg -c \"$s\"";
|
||||
$ret = shell_exec($cmd);
|
||||
}
|
||||
}
|
||||
|
||||
107
lib/php/libsdk/SDK/Build/PGO/Tool/PGO.php
Normal file
107
lib/php/libsdk/SDK/Build/PGO/Tool/PGO.php
Normal file
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Tool;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
|
||||
class PGO
|
||||
{
|
||||
protected $php;
|
||||
protected $conf;
|
||||
protected $idx = 0;
|
||||
|
||||
public function __construct(PGOConfig $conf, Interfaces\PHP $php)
|
||||
{
|
||||
$this->conf = $conf;
|
||||
$this->php = $php;
|
||||
}
|
||||
|
||||
protected function getPgcName(string $fname) : string
|
||||
{
|
||||
$bn = basename($fname, substr($fname, -4, 4));
|
||||
$dn = dirname($fname);
|
||||
|
||||
return $dn . DIRECTORY_SEPARATOR . $bn . "!" . $this->idx . ".pgc";
|
||||
}
|
||||
|
||||
protected function getPgdName(string $fname) : string
|
||||
{
|
||||
$bn = basename($fname, substr($fname, -4, 4));
|
||||
$dn = dirname($fname);
|
||||
|
||||
return $dn . DIRECTORY_SEPARATOR . $bn . ".pgd";
|
||||
}
|
||||
|
||||
protected function getWorkItems() : array
|
||||
{
|
||||
$exe = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.exe");
|
||||
$dll = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.dll");
|
||||
$dll = array_merge($dll, glob($this->php->getExtRootDir() . DIRECTORY_SEPARATOR . "php*.dll"));
|
||||
|
||||
/* find out next index */
|
||||
$tpl = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "php7{ts,}.dll", GLOB_BRACE)[0];
|
||||
if (!$tpl) {
|
||||
throw new Exception("Couldn't find php7[ts].dll in the PHP root dir.");
|
||||
}
|
||||
do {
|
||||
if (!file_exists($this->getPgcName($tpl))) {
|
||||
break;
|
||||
}
|
||||
$this->idx++;
|
||||
} while (true);
|
||||
|
||||
return array_unique(array_merge($exe, $dll));
|
||||
}
|
||||
|
||||
public function dump(bool $merge = true) : void
|
||||
{
|
||||
$its = $this->getWorkItems();
|
||||
|
||||
foreach ($its as $base) {
|
||||
$pgc = $this->getPgcName($base);
|
||||
$pgd = $this->getPgdName($base);
|
||||
|
||||
`pgosweep $base $pgc`;
|
||||
//passthru("pgosweep $base $pgc");
|
||||
|
||||
if ($merge) {
|
||||
`pgomgr /merge:1000 $pgc $pgd`;
|
||||
//passthru("pgomgr /merge:1000 $pgc $pgd");
|
||||
/* File is already spent, no need to keep it.
|
||||
If seeing linker warnings about no pgc
|
||||
were found for some object - most
|
||||
likely the object were not included in
|
||||
any training scenario. */
|
||||
@unlink($pgc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function waste() : void
|
||||
{
|
||||
$this->dump(false);
|
||||
}
|
||||
|
||||
public function clean(bool $clean_pgc = true, bool $clean_pgd = true) : void
|
||||
{
|
||||
if ($clean_pgc) {
|
||||
$its = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.pgc");
|
||||
$its = array_merge($its, glob($this->php->getExtRootDir() . DIRECTORY_SEPARATOR . "*" . DIRECTORY_SEPARATOR . "*.pgc"));
|
||||
foreach (array_unique($its) as $pgc) {
|
||||
unlink($pgc);
|
||||
}
|
||||
}
|
||||
|
||||
if ($clean_pgd) {
|
||||
$its = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.pgd");
|
||||
$its = array_merge($its, glob($this->php->getExtRootDir() . DIRECTORY_SEPARATOR . "*" . DIRECTORY_SEPARATOR . "*.pgd"));
|
||||
foreach (array_unique($its) as $pgd) {
|
||||
`pgomgr /clear $pgd`;
|
||||
//passthru("pgomgr /clear $pgd");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
57
lib/php/libsdk/SDK/Build/PGO/Tool/PackageWorkman.php
Normal file
57
lib/php/libsdk/SDK/Build/PGO/Tool/PackageWorkman.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Tool;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
|
||||
|
||||
class PackageWorkman
|
||||
{
|
||||
use FileOps;
|
||||
|
||||
protected $conf;
|
||||
|
||||
public function __construct(PGOConfig $conf)
|
||||
{
|
||||
$this->conf = $conf;
|
||||
}
|
||||
|
||||
public function fetch(string $url, string $tgt_fn, bool $force = false) : void
|
||||
{
|
||||
$cache_fn = $this->conf->getPkgCacheDir() . DIRECTORY_SEPARATOR . basename($tgt_fn);
|
||||
|
||||
if ($force || !file_exists($cache_fn)) {
|
||||
echo "Fetching '$url' into '$tgt_fn'\n";
|
||||
$this->download($url, $cache_fn);
|
||||
}
|
||||
|
||||
if ($force || !file_exists($tgt_fn)) {
|
||||
if ($cache_fn != $tgt_fn && !$this->cp($cache_fn, $tgt_fn)) {
|
||||
throw new Exception("Failed to copy '$cache_fn' to '$tgt_fn'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Only for zips! */
|
||||
public function fetchAndUnzip(string $url, string $zip_bn, string $zip_tgt_dn, string $tgt_bn = NULL, bool $force = false) : void
|
||||
{
|
||||
$cache_fn = $this->conf->getPkgCacheDir() . DIRECTORY_SEPARATOR . $zip_bn;
|
||||
|
||||
if ($force || !file_exists($cache_fn)) {
|
||||
$this->fetch($url, $cache_fn, $force);
|
||||
}
|
||||
|
||||
$tgt_name = $zip_tgt_dn . ($tgt_bn ? DIRECTORY_SEPARATOR . $tgt_bn : "");
|
||||
if ($force || $tgt_bn && !file_exists($tgt_name) || !$tgt_bn /* This means unzip always if no rename. */) {
|
||||
echo "Unpacking '$cache_fn' to '$tgt_name'\n";
|
||||
try {
|
||||
$this->unzip($cache_fn, $zip_tgt_dn, $tgt_bn);
|
||||
} catch (Throwable $e) {
|
||||
$this->rm($cache_fn);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
121
lib/php/libsdk/SDK/Build/PGO/Tool/Training.php
Normal file
121
lib/php/libsdk/SDK/Build/PGO/Tool/Training.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO\Tool;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
use SDK\Build\PGO\Interfaces\{TrainingCase, Server, Server\DB, PHP};
|
||||
|
||||
class Training
|
||||
{
|
||||
protected $conf;
|
||||
protected $t_case;
|
||||
|
||||
public function __construct(PGOConfig $conf, TrainingCase $t_case)
|
||||
{
|
||||
$this->conf = $conf;
|
||||
$this->t_case = $t_case;
|
||||
|
||||
if (!in_array($this->t_case->getType(), array("web", "cli"))) {
|
||||
throw new Exception("Unknown training type '$type'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function getCase() : TrainingCase
|
||||
{
|
||||
return $this->t_case;
|
||||
}
|
||||
|
||||
public function runWeb(int $max_runs, ?array &$stat = array()) : void
|
||||
{
|
||||
$url_list_fn = $this->t_case->getJobFilename();
|
||||
|
||||
if (!file_exists($url_list_fn)) {
|
||||
printf("\033[31m WARNING: Job file '$url_list_fn' not found!\033[0m\n");
|
||||
}
|
||||
|
||||
$a = file($url_list_fn, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
|
||||
$stat = array("http_code" => array(), "not_ok" => array());
|
||||
|
||||
for ($k = 0; $k < $max_runs; $k++) {
|
||||
echo ".";
|
||||
|
||||
$ch = array();
|
||||
|
||||
$mh = curl_multi_init();
|
||||
|
||||
foreach ($a as $i => $u) {
|
||||
|
||||
$ch[$i] = curl_init($u);
|
||||
|
||||
curl_setopt($ch[$i], CURLOPT_CONNECTTIMEOUT_MS, 500000);
|
||||
curl_setopt($ch[$i], CURLOPT_TIMEOUT_MS, 500000);
|
||||
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch[$i], CURLOPT_USERAGENT, SDKConfig::getSdkUserAgentName());
|
||||
/* ??? */
|
||||
/*curl_setopt($ch[$i], CURLOPT_FOLLOWLOCATION, true);*/
|
||||
|
||||
curl_multi_add_handle($mh, $ch[$i]);
|
||||
}
|
||||
|
||||
$active = NULL;
|
||||
|
||||
do {
|
||||
$mrc = curl_multi_exec($mh, $active);
|
||||
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
|
||||
|
||||
while ($active && $mrc == CURLM_OK) {
|
||||
if (curl_multi_select($mh, 42.0) != -1) {
|
||||
do {
|
||||
$mrc = curl_multi_exec($mh, $active);
|
||||
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($ch as $h) {
|
||||
curl_multi_remove_handle($mh, $h);
|
||||
|
||||
/* Gather some stats */
|
||||
$info = curl_getinfo($h);
|
||||
$http_code = $info["http_code"];
|
||||
|
||||
if (isset($stat["http_code"][$http_code])) {
|
||||
$stat["http_code"][$http_code]++;
|
||||
} else {
|
||||
$stat["http_code"][$http_code] = 1;
|
||||
}
|
||||
|
||||
if (!$this->t_case->httpStatusOk((int)$http_code)) {
|
||||
$stat["not_ok"][] = $info;
|
||||
|
||||
//echo curl_multi_getcontent($h) ;
|
||||
}
|
||||
|
||||
curl_close($h);
|
||||
}
|
||||
|
||||
curl_multi_close($mh);
|
||||
|
||||
}
|
||||
|
||||
echo "\n";
|
||||
|
||||
}
|
||||
|
||||
/* TODO Extend with number runs. */
|
||||
public function run(int $max_runs = 1, ?array &$stat = array()) : void
|
||||
{
|
||||
$type = $this->t_case->getType();
|
||||
switch ($type)
|
||||
{
|
||||
case "web":
|
||||
$this->runWeb($max_runs, $stat);
|
||||
break;
|
||||
|
||||
case "cli":
|
||||
default:
|
||||
throw new Exception("Unknown training type '$type'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
102
lib/php/libsdk/SDK/Build/PGO/TrainingCaseIterator.php
Normal file
102
lib/php/libsdk/SDK/Build/PGO/TrainingCaseIterator.php
Normal file
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
namespace SDK\Build\PGO;
|
||||
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Config as PGOConfig;
|
||||
|
||||
|
||||
class TrainingCaseIterator implements \Iterator
|
||||
{
|
||||
protected $conf;
|
||||
protected $items = array();
|
||||
protected $idx;
|
||||
protected $el;
|
||||
|
||||
public function __construct(PGOConfig $conf)
|
||||
{
|
||||
$this->rewind();
|
||||
|
||||
$this->conf = $conf;
|
||||
|
||||
$items = glob($this->conf->getCasesTplDir() . DIRECTORY_SEPARATOR . "*");
|
||||
foreach ($items as $it) {
|
||||
if(!is_dir($it)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!file_exists($this->getHandlerFilename($it))) {
|
||||
echo "Test case handler isn't present in '$it'.\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($this->isInactive($it)) {
|
||||
echo "The test case in '$it' is marked inactive.\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->items[] = $it;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
protected function isInactive(string $base) : bool
|
||||
{
|
||||
return file_exists($base . DIRECTORY_SEPARATOR . "inactive");
|
||||
}
|
||||
|
||||
protected function getHandlerFilename(string $base) : string
|
||||
{
|
||||
return $base . DIRECTORY_SEPARATOR . "TrainingCaseHandler.php";
|
||||
}
|
||||
|
||||
public function current()
|
||||
{
|
||||
$base = $this->items[$this->idx];
|
||||
$ns = basename($base);
|
||||
|
||||
/* Don't overwrite generated config. */
|
||||
$it = $this->conf->getSectionItem($ns);
|
||||
if (!$it) {
|
||||
$this->conf->importSectionFromDir($ns, $base);
|
||||
}
|
||||
|
||||
require_once $this->getHandlerFilename($base);
|
||||
|
||||
$srv_http = $this->conf->getSrv($this->conf->getSectionItem($ns, "srv_http"));
|
||||
$srv_db = $this->conf->getSrv($this->conf->getSectionItem($ns, "srv_db"));
|
||||
|
||||
$class = "$ns\\TrainingCaseHandler";
|
||||
|
||||
$this->el = new $class($this->conf, $srv_http, $srv_db);
|
||||
|
||||
return $this->el;
|
||||
}
|
||||
|
||||
public function next()
|
||||
{
|
||||
$this->idx++;
|
||||
}
|
||||
|
||||
public function rewind()
|
||||
{
|
||||
$this->idx = 0;
|
||||
}
|
||||
|
||||
public function valid()
|
||||
{
|
||||
return $this->idx < count($this->items);
|
||||
}
|
||||
|
||||
public function key()
|
||||
{
|
||||
if (!is_object($this->el)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return $this->el->getName();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,7 +10,8 @@ class Config
|
||||
{
|
||||
/* Config variables. */
|
||||
protected static $depsHost = 'windows.php.net';
|
||||
protected static $depsPort = 80;
|
||||
protected static $depsPort = 443;
|
||||
protected static $depsUriScheme = "https";
|
||||
protected static $depsBaseUri = "/downloads/php-sdk/deps";
|
||||
|
||||
/* protected static $sdkNugetFeedUrl = "http://127.0.0.1/sdk/nuget"; */
|
||||
@@ -34,6 +35,11 @@ class Config
|
||||
return self::$depsPort;
|
||||
}/*}}}*/
|
||||
|
||||
public static function getDepsUriScheme() : string
|
||||
{/*{{{*/
|
||||
return self::$depsUriScheme;
|
||||
}/*}}}*/
|
||||
|
||||
public static function getDepsBaseUri() : string
|
||||
{/*{{{*/
|
||||
return self::$depsBaseUri;
|
||||
@@ -125,7 +131,7 @@ class Config
|
||||
if (empty(self::$knownBranches)) {
|
||||
$cache_file = "known_branches.txt";
|
||||
$cache = new Cache(self::getDepsLocalPath());
|
||||
$fetcher = new Fetcher(self::$depsHost, self::$depsPort);
|
||||
$fetcher = new Fetcher(self::$depsHost, self::$depsPort, self::$depsUriScheme);
|
||||
|
||||
$tmp = $fetcher->getByUri(self::$depsBaseUri . "/series/");
|
||||
if (false !== $tmp) {
|
||||
@@ -247,7 +253,8 @@ class Config
|
||||
$data = $branches[$current_branch_name][$cur_crt];
|
||||
} else {
|
||||
/* Evaluate CRTs, to avoid ambiquity. */
|
||||
list($crt, $data) = each($branches[$current_branch_name]);
|
||||
$crt = key($branches[$current_branch_name]);
|
||||
$data = $branches[$current_branch_name][$crt];
|
||||
if ($crt != $cur_crt) {
|
||||
throw new Exception("The passed CRT '$cur_crt' doesn't match any availbale for branch '$current_branch_name'");
|
||||
}
|
||||
@@ -376,6 +383,11 @@ class Config
|
||||
|
||||
return $path;
|
||||
}/*}}}*/
|
||||
|
||||
public static function getSdkUserAgentName() : string
|
||||
{/*{{{*/
|
||||
return "PHP-SDK-BINARY-TOOLS/" . self::getSdkVersion();
|
||||
}/*}}}*/
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -116,27 +116,34 @@ trait FileOps
|
||||
return $ret;
|
||||
}/*}}}*/
|
||||
|
||||
protected function download(string $url, string $dest = NULL) : ?string
|
||||
protected function download(string $url, string $dest_fn = NULL) : ?string
|
||||
{/*{{{*/
|
||||
$fd = NULL;
|
||||
$ch = curl_init($url);
|
||||
$ch = curl_init();
|
||||
|
||||
if ($dest) {
|
||||
$fd = fopen($dest, "w+");
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
|
||||
if ($dest_fn) {
|
||||
$fd = fopen($dest_fn, "w+");
|
||||
curl_setopt($ch, CURLOPT_FILE, $fd);
|
||||
} else {
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
}
|
||||
|
||||
curl_setopt($ch, CURLOPT_HEADER, false);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, Config::getSdkUserAgentName());
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
||||
|
||||
$ret = curl_exec($ch);
|
||||
if (false === $ret) {
|
||||
$err = curl_error();
|
||||
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
if (false === $ret || 200 !== $code) {
|
||||
$err = curl_error($ch);
|
||||
curl_close($ch);
|
||||
if ($dest) {
|
||||
if ($dest_fn) {
|
||||
fclose($fd);
|
||||
}
|
||||
throw new Exception($err);
|
||||
@@ -144,13 +151,67 @@ trait FileOps
|
||||
|
||||
curl_close($ch);
|
||||
|
||||
if ($dest) {
|
||||
if ($dest_fn) {
|
||||
fclose($fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}/*}}}*/
|
||||
|
||||
/* TODO More detailed zip errors. */
|
||||
protected function unzip(string $zip_fn, string $dest_fn, string $dest_dn = NULL) : void
|
||||
{/*{{{*/
|
||||
$zip = new \ZipArchive;
|
||||
|
||||
$res = $zip->open($zip_fn);
|
||||
if (true !== $res) {
|
||||
throw new Exception("Failed to open '$zip_fn'.");
|
||||
}
|
||||
|
||||
$res = $zip->extractTo($dest_fn);
|
||||
if (true !== $res) {
|
||||
$zip->close();
|
||||
throw new Exception("Failed to unzip '$zip_fn'.");
|
||||
}
|
||||
|
||||
/* Not robust, useful for zips containing one dir sibling only in the root. */
|
||||
if ($dest_dn) {
|
||||
$stat = $zip->statIndex(0);
|
||||
if (false === $stat) {
|
||||
$zip->close();
|
||||
throw new Exception("Failed to stat first index in '$zip_fn'.");
|
||||
}
|
||||
|
||||
$zip->close();
|
||||
|
||||
/* Index of zero might be not the zipped folder, unusual but true. */
|
||||
/*$name = $stat["name"];
|
||||
if ("/" != substr($name, -1)) {
|
||||
throw new Exception("'$name' is not a directory.");
|
||||
}
|
||||
$name = substr($name, 0, -1);*/
|
||||
|
||||
$name = rtrim($stat["name"], "/");
|
||||
while (strchr($name, '/') !== false) {
|
||||
$name = dirname($name);
|
||||
}
|
||||
|
||||
$old_dir = $dest_fn . DIRECTORY_SEPARATOR . $name;
|
||||
$new_dir = $dest_fn . DIRECTORY_SEPARATOR . $dest_dn;
|
||||
if (file_exists($new_dir)) {
|
||||
if (!$this->rm($new_dir)) {
|
||||
throw new Exception("Failed to remove '$new_dir'.");
|
||||
}
|
||||
}
|
||||
/* if (!$this->mv($old_dir, $new_dir)) { */
|
||||
if (!rename($old_dir, $new_dir)) {
|
||||
throw new Exception("Failed to rename '$old_dir' to '$new_dir'.");
|
||||
}
|
||||
} else {
|
||||
$zip->close();
|
||||
}
|
||||
}/*}}}*/
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
<?php
|
||||
|
||||
function __autoload($name)
|
||||
{
|
||||
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . $name . ".php";
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: sw=4 ts=4 fdm=marker
|
||||
* vim<600: sw=4 ts=4
|
||||
*/
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
msys2/usr/bin/msys-icuuc60.dll
Normal file
BIN
msys2/usr/bin/msys-icuuc60.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
msys2/usr/bin/msys-mpfr-6.dll
Normal file
BIN
msys2/usr/bin/msys-mpfr-6.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
170
pgo/cases/joomla/TrainingCaseHandler.php
Normal file
170
pgo/cases/joomla/TrainingCaseHandler.php
Normal file
@@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
namespace joomla;
|
||||
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\PHP;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool;
|
||||
|
||||
class TrainingCaseHandler extends Abstracts\TrainingCase implements Interfaces\TrainingCase
|
||||
{
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $nginx;
|
||||
protected $php;
|
||||
protected $maria;
|
||||
protected $max_runs = 4;
|
||||
|
||||
public function __construct(Config $conf, ?Interfaces\Server $nginx, ?Interfaces\Server\DB $maria)
|
||||
{
|
||||
if (!$nginx) {
|
||||
throw new Exception("Invalid NGINX object");
|
||||
}
|
||||
|
||||
$this->conf = $conf;
|
||||
$this->base = $this->conf->getCaseWorkDir($this->getName());
|
||||
$this->nginx = $nginx;
|
||||
$this->php = $nginx->getPhp();
|
||||
$this->maria = $maria;
|
||||
}
|
||||
|
||||
public function getName() : string
|
||||
{
|
||||
return __NAMESPACE__;
|
||||
}
|
||||
|
||||
public function getJobFilename() : string
|
||||
{
|
||||
return $this->conf->getJobDir() . DIRECTORY_SEPARATOR . $this->getName() . ".txt";
|
||||
}
|
||||
|
||||
protected function getToolFn() : string
|
||||
{
|
||||
return $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, array("joomla", "vendor", "joomlatools", "console", "bin", "joomla"));
|
||||
}
|
||||
|
||||
protected function setupDist() : void
|
||||
{
|
||||
$port = $this->getHttpPort();
|
||||
$host = $this->getHttpHost();
|
||||
$db_port = $this->getDbPort();
|
||||
$db_host = $this->getDbHost();
|
||||
$db_user = $this->getDbUser();
|
||||
$db_pass = $this->getDbPass();
|
||||
|
||||
$vars = array(
|
||||
$this->conf->buildTplVarName($this->getName(), "docroot") => str_replace("\\", "/", $this->base),
|
||||
);
|
||||
$tpl_fn = $this->conf->getCasesTplDir($this->getName()) . DIRECTORY_SEPARATOR . "nginx.partial.conf";
|
||||
$this->nginx->addServer($tpl_fn, $vars);
|
||||
|
||||
$php = new PHP\CLI($this->conf);
|
||||
|
||||
$this->maria->up();
|
||||
$this->nginx->up();
|
||||
|
||||
$this->maria->query("DROP DATABASE IF EXISTS " . $this->getName());
|
||||
$this->maria->query("CREATE DATABASE " . $this->getName() . " CHARACTER SET utf8");
|
||||
|
||||
$htdocs = $this->conf->getCaseWorkDir($this->getName());
|
||||
if (is_dir($htdocs . DIRECTORY_SEPARATOR . "_installation")) {
|
||||
rename($htdocs . DIRECTORY_SEPARATOR . "_installation", $htdocs . DIRECTORY_SEPARATOR . "installation");
|
||||
}
|
||||
|
||||
$env = array(
|
||||
"PATH" => $this->conf->getSrvDir(strtolower($this->maria->getName())) . DIRECTORY_SEPARATOR . "bin",
|
||||
);
|
||||
|
||||
$www = $this->conf->getCaseWorkDir();
|
||||
$login = $db_pass ? "$db_user:$db_pass" : $db_user;
|
||||
$cmd = $this->getToolFn() . " site:install --overwrite --sample-data=learn --mysql-database=" . $this->getName() . " --mysql-login=$login --mysql-host=$db_host --mysql-port=$db_port --www=$www " . $this->getName();
|
||||
//$cmd = $this->getToolFn() . " site:install --drop --overwrite --sample-data=default --mysql-database=" . $this->getName() . " --mysql-login=$login --mysql-host=$db_host --mysql-port=$db_port --www=$www " . $this->getName();
|
||||
//$cmd = $this->getToolFn() . " site:create --clear-cache --disable-ssl --release=3.7 --http-port=$port --sample-data=testing --mysql-database=" . $this->getName() . " --mysql-login=$login --mysql-host=$db_host --mysql-port=$db_port --www=$www " . $this->getName();
|
||||
$php->exec($cmd, NULL, $env);
|
||||
|
||||
if (is_dir($htdocs . DIRECTORY_SEPARATOR . "installation")) {
|
||||
rename($htdocs . DIRECTORY_SEPARATOR . "installation", $htdocs . DIRECTORY_SEPARATOR . "_installation");
|
||||
}
|
||||
|
||||
$fn = $htdocs . DIRECTORY_SEPARATOR . "configuration.php";
|
||||
$s = file_get_contents($fn);
|
||||
$s = str_replace("public \$debug = '1';", "public \$debug = '0';", $s);
|
||||
if (strlen($s) !== file_put_contents($fn, $s)) {
|
||||
throw new Exception("Couldn't write '$fn'.");
|
||||
}
|
||||
|
||||
$this->nginx->down(true);
|
||||
$this->maria->down(true);
|
||||
}
|
||||
|
||||
public function setupUrls()
|
||||
{
|
||||
$this->maria->up();
|
||||
$this->nginx->up();
|
||||
|
||||
$url = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort();
|
||||
$s = file_get_contents($url);
|
||||
|
||||
$this->nginx->down(true);
|
||||
$this->maria->down(true);
|
||||
|
||||
echo "Generating training urls.\n";
|
||||
|
||||
$lst = array();
|
||||
if (preg_match_all(", href=\"([^\"]+)\",", $s, $m)) {
|
||||
foreach ($m[1] as $u) {
|
||||
if ("/" == $u[0] && "/" != $u[1] && !in_array(substr($u, -3), array("css", "xml", "ico"))) {
|
||||
$ur = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort() . $u;
|
||||
if (!in_array($ur, $lst)) {
|
||||
$lst[] = $ur;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($lst)) {
|
||||
printf("\033[31m WARNING: Training URL list is empty, check the regex and the possible previous error messages!\033[0m\n");
|
||||
}
|
||||
|
||||
$fn = $this->getJobFilename();
|
||||
$s = implode("\n", $lst);
|
||||
if (strlen($s) !== file_put_contents($fn, $s)) {
|
||||
throw new Exception("Couldn't write '$fn'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function prepareInit(Tool\PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$php = new PHP\CLI($this->conf);
|
||||
|
||||
$composer = $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "composer.phar";
|
||||
$joomla_cli_base = $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "joomla";
|
||||
if (!file_exists($this->getToolFn()) || $force) {
|
||||
if (!is_dir($joomla_cli_base)) {
|
||||
mkdir($joomla_cli_base);
|
||||
}
|
||||
$cmd = $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "composer.phar require joomlatools/console --working-dir=" . $joomla_cli_base;
|
||||
$php->exec($cmd);
|
||||
}
|
||||
|
||||
$url = $this->conf->getSectionItem($this->getName(), "joomla_zip_url");
|
||||
$pw->fetchAndUnzip($url, "joomla.zip", $this->conf->getCaseWorkDir($this->getName()), $this->getName(), $force);
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->getName() . ".\n";
|
||||
echo "It is OK to see some warnings here, because the joomla tools are not fully Windows compatible.\n";
|
||||
|
||||
$this->setupDist();
|
||||
$this->setupUrls();
|
||||
|
||||
echo $this->getName() . " initialization done.\n";
|
||||
echo $this->getName() . " site configured to run under " . $this->getHttpHost() . ":" .$this->getHttpPort() . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
0
pgo/cases/joomla/inactive
Normal file
0
pgo/cases/joomla/inactive
Normal file
18
pgo/cases/joomla/nginx.partial.conf
Normal file
18
pgo/cases/joomla/nginx.partial.conf
Normal file
@@ -0,0 +1,18 @@
|
||||
server {
|
||||
listen PHP_SDK_PGO_JOOMLA_HTTP_PORT;
|
||||
server_name PHP_SDK_PGO_JOOMLA_HTTP_HOST;
|
||||
|
||||
root PHP_SDK_PGO_JOOMLA_DOCROOT;
|
||||
index index.php index.html index.htm default.html default.htm;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$args;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass PHP_SDK_PGO_PHP_FCGI_HOST:PHP_SDK_PGO_PHP_FCGI_PORT;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
}
|
||||
}
|
||||
6
pgo/cases/joomla/phpsdk_pgo.json
Normal file
6
pgo/cases/joomla/phpsdk_pgo.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"joomla_zip_url": "https://github.com/joomla/joomla-cms/releases/download/3.7.2/Joomla_3.7.2-Stable-Full_Package.zip",
|
||||
"type": "web",
|
||||
"srv_http": "nginx",
|
||||
"srv_db": "mariadb"
|
||||
}
|
||||
162
pgo/cases/mediawiki/TrainingCaseHandler.php
Normal file
162
pgo/cases/mediawiki/TrainingCaseHandler.php
Normal file
@@ -0,0 +1,162 @@
|
||||
<?php
|
||||
|
||||
namespace mediawiki;
|
||||
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\PHP;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool;
|
||||
|
||||
class TrainingCaseHandler extends Abstracts\TrainingCase implements Interfaces\TrainingCase
|
||||
{
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $nginx;
|
||||
protected $php;
|
||||
protected $max_runs = 4;
|
||||
|
||||
public function __construct(Config $conf, ?Interfaces\Server $nginx, ?Interfaces\Server\DB $srv_db)
|
||||
{
|
||||
if (!$nginx) {
|
||||
throw new Exception("Invalid NGINX object");
|
||||
}
|
||||
|
||||
$this->conf = $conf;
|
||||
$this->base = $this->conf->getCaseWorkDir($this->getName());
|
||||
$this->nginx = $nginx;
|
||||
$this->php = $nginx->getPhp();
|
||||
}
|
||||
|
||||
public function getName() : string
|
||||
{
|
||||
return __NAMESPACE__;
|
||||
}
|
||||
|
||||
public function getJobFilename() : string
|
||||
{
|
||||
return $this->conf->getJobDir() . DIRECTORY_SEPARATOR . $this->getName() . ".txt";
|
||||
}
|
||||
|
||||
protected function getToolFn(string $what) : string
|
||||
{
|
||||
$ret = NULL;
|
||||
if ("install" == $what) {
|
||||
$ret = $this->conf->getCaseWorkDir($this->getName()) . DIRECTORY_SEPARATOR . "maintenance" . DIRECTORY_SEPARATOR . "install.php";
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
protected function setupDist() : void
|
||||
{
|
||||
$php = new PHP\CLI($this->conf);
|
||||
|
||||
$port = $this->getHttpPort();
|
||||
$host = $this->getHttpHost();
|
||||
|
||||
$vars = array(
|
||||
$this->conf->buildTplVarName($this->getName(), "docroot") => str_replace("\\", "/", $this->base),
|
||||
);
|
||||
$tpl_fn = $this->conf->getCasesTplDir($this->getName()) . DIRECTORY_SEPARATOR . "nginx.partial.conf";
|
||||
$this->nginx->addServer($tpl_fn, $vars);
|
||||
|
||||
$settings = $this->conf->getCaseWorkDir($this->getName()) . DIRECTORY_SEPARATOR . "LocalSettings.php";
|
||||
if (is_file($settings)) {
|
||||
unlink($settings);
|
||||
}
|
||||
|
||||
$site_adm = trim(shell_exec("pwgen -1 -s 8"));
|
||||
$this->conf->setSectionItem($this->getName(), "site_admin_user", $site_adm);
|
||||
$site_pw = trim(shell_exec("pwgen -1 -s 8"));
|
||||
$this->conf->setSectionItem($this->getName(), "site_admin_pass", $site_pw);
|
||||
|
||||
$db_dir = $this->conf->getCaseWorkDir($this->getName()) . DIRECTORY_SEPARATOR . "database";
|
||||
$nom = $this->getName();
|
||||
$db_dir = $this->conf->getCaseWorkDir($this->getName()) . DIRECTORY_SEPARATOR . "database";
|
||||
if (!is_dir($db_dir)) {
|
||||
mkdir($db_dir);
|
||||
}
|
||||
$cmd = $this->getToolFn("install") . " --dbtype=sqlite --dbpath=$db_dir --pass=$site_pw --server=http://$host:$port/ $nom $site_adm";
|
||||
echo "$cmd\n";
|
||||
$php->exec($cmd);
|
||||
}
|
||||
|
||||
public function setupUrls()
|
||||
{
|
||||
$this->nginx->up();
|
||||
|
||||
$url = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort();
|
||||
$s = file_get_contents($url);
|
||||
|
||||
echo "Generating training urls.\n";
|
||||
|
||||
$lst = array();
|
||||
if (preg_match_all(", href=\"([^\"]+)\",", $s, $m)) {
|
||||
foreach ($m[1] as $u) {
|
||||
if ("/" == $u[0] && "/" != $u[1] && !in_array(substr($u, -3), array("css", "xml", "ico"))) {
|
||||
$u = str_replace(
|
||||
array("&"),
|
||||
array("&"),
|
||||
$u
|
||||
);
|
||||
$ur = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort() . $u;
|
||||
if (!in_array($ur, $lst) && $this->probeUrl($ur)) {
|
||||
$lst[] = $ur;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->nginx->down(true);
|
||||
|
||||
if (empty($lst)) {
|
||||
printf("\033[31m WARNING: Training URL list is empty, check the regex and the possible previous error messages!\033[0m\n");
|
||||
}
|
||||
|
||||
$fn = $this->getJobFilename();
|
||||
$s = implode("\n", $lst);
|
||||
if (strlen($s) !== file_put_contents($fn, $s)) {
|
||||
throw new Exception("Couldn't write '$fn'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function prepareInit(Tool\PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$url = $this->conf->getSectionItem($this->getName(), "mediawiki_zip_url");
|
||||
$pw->fetchAndUnzip($url, "mediawiki.zip", $this->conf->getCaseWorkDir(), $this->getName(), $force);
|
||||
|
||||
$php = new PHP\CLI($this->conf);
|
||||
|
||||
$lock = $this->conf->getCaseWorkDir($this->getName()) . DIRECTORY_SEPARATOR . "composer.lock";
|
||||
if (!file_exists($lock) || $force) {
|
||||
$composer = $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "composer.phar";
|
||||
$composer_cmd = file_exists($lock) ? "update" : "install";
|
||||
$cmd = $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "composer.phar $composer_cmd --no-dev --working-dir=" . $this->conf->getCaseWorkDir($this->getName());
|
||||
$php->exec($cmd);
|
||||
}
|
||||
|
||||
$skin_url = "https://github.com/wikimedia/mediawiki-skins-Vector/archive/master.zip";
|
||||
$skin_path = $this->conf->getCaseWorkDir($this->getName()) . DIRECTORY_SEPARATOR . "skins" . DIRECTORY_SEPARATOR . "Vector";
|
||||
if (!file_exists($skin_path . DIRECTORY_SEPARATOR . "SkinVector.php")) {
|
||||
if (is_dir($skin_path)) {
|
||||
rmdir($skin_path);
|
||||
}
|
||||
$pw->fetchAndUnzip($skin_url, "mediawiki_skin.zip", dirname($skin_path), "Vector", $force);
|
||||
}
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->getName() . ".\n";
|
||||
|
||||
$this->setupDist();
|
||||
$this->setupUrls();
|
||||
|
||||
echo $this->getName() . " initialization done.\n";
|
||||
echo $this->getName() . " site configured to run under " . $this->getHttpHost() . ":" .$this->getHttpPort() . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
0
pgo/cases/mediawiki/inactive
Normal file
0
pgo/cases/mediawiki/inactive
Normal file
30
pgo/cases/mediawiki/nginx.partial.conf
Normal file
30
pgo/cases/mediawiki/nginx.partial.conf
Normal file
@@ -0,0 +1,30 @@
|
||||
server {
|
||||
listen PHP_SDK_PGO_MEDIAWIKI_HTTP_PORT;
|
||||
server_name PHP_SDK_PGO_MEDIAWIKI_HTTP_HOST;
|
||||
|
||||
root PHP_SDK_PGO_MEDIAWIKI_DOCROOT;
|
||||
index index.php index.html index.htm default.html default.htm;
|
||||
|
||||
client_max_body_size 5m;
|
||||
client_body_timeout 60;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ @rewrite;
|
||||
}
|
||||
|
||||
location @rewrite {
|
||||
rewrite ^/(.*)$ /index.php?title=$1&$args;
|
||||
}
|
||||
|
||||
location ^~ /maintenance/ {
|
||||
return 403;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass PHP_SDK_PGO_PHP_FCGI_HOST:PHP_SDK_PGO_PHP_FCGI_PORT;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
try_files $uri @rewrite;
|
||||
}
|
||||
}
|
||||
6
pgo/cases/mediawiki/phpsdk_pgo.json
Normal file
6
pgo/cases/mediawiki/phpsdk_pgo.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"mediawiki_zip_url": "https://github.com/wikimedia/mediawiki/archive/1.29.0.zip",
|
||||
"type": "web",
|
||||
"srv_http": "nginx",
|
||||
"srv_db": null
|
||||
}
|
||||
134
pgo/cases/pgo01org/TrainingCaseHandler.php
Normal file
134
pgo/cases/pgo01org/TrainingCaseHandler.php
Normal file
@@ -0,0 +1,134 @@
|
||||
<?php
|
||||
|
||||
namespace pgo01org;
|
||||
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\PHP;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool;
|
||||
|
||||
class TrainingCaseHandler extends Abstracts\TrainingCase implements Interfaces\TrainingCase
|
||||
{
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $nginx;
|
||||
protected $maria;
|
||||
protected $php;
|
||||
protected $max_runs = 8;
|
||||
|
||||
public function __construct(Config $conf, ?Interfaces\Server $nginx, ?Interfaces\Server\DB $maria)
|
||||
{
|
||||
if (!$nginx) {
|
||||
throw new Exception("Invalid NGINX object");
|
||||
}
|
||||
|
||||
$this->conf = $conf;
|
||||
$this->base = $this->conf->getCaseWorkDir($this->getName());
|
||||
$this->nginx = $nginx;
|
||||
$this->maria = $maria;
|
||||
$this->php = $nginx->getPhp();
|
||||
}
|
||||
|
||||
public function getName() : string
|
||||
{
|
||||
return __NAMESPACE__;
|
||||
}
|
||||
|
||||
public function getJobFilename() : string
|
||||
{
|
||||
return $this->conf->getJobDir() . DIRECTORY_SEPARATOR . $this->getName() . ".txt";
|
||||
}
|
||||
|
||||
protected function getToolFn() : string
|
||||
{
|
||||
return $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "wp-cli.phar";
|
||||
}
|
||||
|
||||
protected function setupDist() : void
|
||||
{
|
||||
$cmd_path_arg = "--path=" . $this->base;
|
||||
|
||||
if (!is_dir($this->base)) {
|
||||
echo "Setting up " . $this->getName() . " in '{$this->base}'\n";
|
||||
/* XXX Use host PHP for this. */
|
||||
$php = new PHP\CLI($this->conf);
|
||||
$php->exec($this->getToolFn() . " core download --force $cmd_path_arg");
|
||||
unset($php);
|
||||
}
|
||||
|
||||
$http_port = $this->getHttpPort();
|
||||
$http_host = $this->getHttpHost();
|
||||
$db_port = $this->getDbPort();
|
||||
$db_host = $this->getDbHost();
|
||||
$db_user = $this->getDbUser();
|
||||
$db_pass = $this->getDbPass();
|
||||
|
||||
$vars = array(
|
||||
$this->conf->buildTplVarName($this->getName(), "docroot") => str_replace("\\", "/", $this->base),
|
||||
);
|
||||
$tpl_fn = $this->conf->getCasesTplDir($this->getName()) . DIRECTORY_SEPARATOR . "nginx.partial.conf";
|
||||
$this->nginx->addServer($tpl_fn, $vars);
|
||||
|
||||
|
||||
$php = new PHP\CLI($this->conf);
|
||||
|
||||
$this->maria->up();
|
||||
$this->nginx->up();
|
||||
|
||||
// $this->maria->query("DROP DATABASE IF EXISTS " . $this->getName());
|
||||
// $this->maria->query("CREATE DATABASE " . $this->getName());
|
||||
|
||||
$htdocs = $this->conf->getHtdocs($this->getName());
|
||||
$fl = $htdocs . DIRECTORY_SEPARATOR . "constants.php";
|
||||
|
||||
$constants = file_get_contents($fl);
|
||||
|
||||
$constants = preg_replace(",define\('DB_USER'.+,", "define('DB_USER', '$db_user');", $constants);
|
||||
$constants = preg_replace(",define\('DB_PASSWORD'.+,", "define('DB_PASSWORD', '$db_pass');", $constants);
|
||||
$constants = preg_replace(",define\('DB_NAME'.+,", "define('DB_NAME', '" . $this->getName() . "');", $constants);
|
||||
$constants = preg_replace(",define\('DB_HOST'.+,", "define('DB_HOST', '$db_host:$db_port');", $constants);
|
||||
file_put_contents($fl, $constants);
|
||||
|
||||
//$php->exec($cmd, NULL, $env);
|
||||
/* TODO check status or switch to cli. */
|
||||
$out = file_get_contents("http://$http_host:$http_port/init.php");
|
||||
echo $out, PHP_EOL;
|
||||
|
||||
$this->nginx->down(true);
|
||||
$this->maria->down(true);
|
||||
|
||||
}
|
||||
|
||||
public function setupUrls()
|
||||
{
|
||||
$url = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort();
|
||||
|
||||
echo "Generating training urls.\n";
|
||||
|
||||
$fn = $this->getJobFilename();
|
||||
if (strlen($url) !== file_put_contents($fn, $url)) {
|
||||
throw new Exception("Couldn't write '$fn'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function prepareInit(Tool\PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$url = $this->conf->getSectionItem($this->getName(), "pgo01org_zip_url");
|
||||
$pw->fetchAndUnzip($url, "php_pgo_training_scripts_01org.zip", $this->conf->getHtdocs(), "pgo01org", $force);
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->getName() . ".\n";
|
||||
|
||||
$this->setupDist();
|
||||
$this->setupUrls();
|
||||
|
||||
echo $this->getName() . " initialization done.\n";
|
||||
echo $this->getName() . " site configured to run under " . $this->getHttpHost() . ":" .$this->getHttpPort() . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
14
pgo/cases/pgo01org/nginx.partial.conf
Normal file
14
pgo/cases/pgo01org/nginx.partial.conf
Normal file
@@ -0,0 +1,14 @@
|
||||
server {
|
||||
listen PHP_SDK_PGO_PGO01ORG_HTTP_PORT;
|
||||
server_name PHP_SDK_PGO_PGO01ORG_HTTP_HOST;
|
||||
|
||||
root PHP_SDK_PGO_PGO01ORG_DOCROOT;
|
||||
index index.html index.htm index.php;
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass PHP_SDK_PGO_PHP_FCGI_HOST:PHP_SDK_PGO_PHP_FCGI_PORT;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
}
|
||||
}
|
||||
6
pgo/cases/pgo01org/phpsdk_pgo.json
Normal file
6
pgo/cases/pgo01org/phpsdk_pgo.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"pgo01org_zip_url": "https://github.com/01org/php_pgo_training_scripts/archive/master.zip",
|
||||
"type": "web",
|
||||
"srv_http": "nginx",
|
||||
"srv_db": "mariadb"
|
||||
}
|
||||
117
pgo/cases/symfony_demo/TrainingCaseHandler.php
Normal file
117
pgo/cases/symfony_demo/TrainingCaseHandler.php
Normal file
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
namespace symfony_demo;
|
||||
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\PHP;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool;
|
||||
|
||||
class TrainingCaseHandler extends Abstracts\TrainingCase implements Interfaces\TrainingCase
|
||||
{
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $nginx;
|
||||
protected $php;
|
||||
protected $max_runs = 4;
|
||||
|
||||
public function __construct(Config $conf, ?Interfaces\Server $nginx, ?Interfaces\Server\DB $srv_db)
|
||||
{
|
||||
if (!$nginx) {
|
||||
throw new Exception("Invalid NGINX object");
|
||||
}
|
||||
|
||||
$this->conf = $conf;
|
||||
$this->base = $this->conf->getCaseWorkDir($this->getName());
|
||||
$this->nginx = $nginx;
|
||||
$this->php = $nginx->getPhp();
|
||||
}
|
||||
|
||||
public function getName() : string
|
||||
{
|
||||
return __NAMESPACE__;
|
||||
}
|
||||
|
||||
public function getJobFilename() : string
|
||||
{
|
||||
return $this->conf->getJobDir() . DIRECTORY_SEPARATOR . $this->getName() . ".txt";
|
||||
}
|
||||
|
||||
protected function getToolFn() : string
|
||||
{
|
||||
return $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "symfony.phar";
|
||||
}
|
||||
|
||||
protected function setupDist() : void
|
||||
{
|
||||
if (!is_dir($this->conf->getCaseWorkDir($this->getName()))) {
|
||||
echo "Setting up in '{$this->base}'\n";
|
||||
$php = new PHP\CLI($this->conf);
|
||||
$php->exec($this->getToolFn() . " demo " . $this->base);
|
||||
}
|
||||
|
||||
$port = $this->getHttpPort();
|
||||
$host = $this->getHttpHost();
|
||||
|
||||
$vars = array(
|
||||
$this->conf->buildTplVarName($this->getName(), "docroot") => str_replace("\\", "/", $this->base . DIRECTORY_SEPARATOR . "web"),
|
||||
);
|
||||
$tpl_fn = $this->conf->getCasesTplDir($this->getName()) . DIRECTORY_SEPARATOR . "nginx.partial.conf";
|
||||
$this->nginx->addServer($tpl_fn, $vars);
|
||||
}
|
||||
|
||||
public function setupUrls()
|
||||
{
|
||||
$this->nginx->up();
|
||||
|
||||
$url = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort() . "/en/blog/";
|
||||
$s = file_get_contents($url);
|
||||
|
||||
echo "Generating training urls.\n";
|
||||
|
||||
$lst = array();
|
||||
if (preg_match_all(", href=\"([^\"]+)\",", $s, $m)) {
|
||||
foreach ($m[1] as $u) {
|
||||
if (strlen($u) >= 2 && "/" == $u[0] && "/" != $u[1] && !in_array(substr($u, -3), array("css", "xml", "ico"))) {
|
||||
$ur = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort() . $u;
|
||||
if (!in_array($ur, $lst) && $this->probeUrl($ur)) {
|
||||
$lst[] = $ur;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($lst)) {
|
||||
printf("\033[31m WARNING: Training URL list is empty, check the regex and the possible previous error messages!\033[0m\n");
|
||||
}
|
||||
|
||||
$this->nginx->down(true);
|
||||
|
||||
$fn = $this->getJobFilename();
|
||||
$s = implode("\n", $lst);
|
||||
if (strlen($s) !== file_put_contents($fn, $s)) {
|
||||
throw new Exception("Couldn't write '$fn'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function prepareInit(Tool\PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$url = $this->conf->getSectionItem($this->getName(), "symfony_phar_url");
|
||||
$pw->fetch($url, $this->getToolFn(), $force);
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->getName() . ".\n";
|
||||
|
||||
$this->setupDist();
|
||||
$this->setupUrls();
|
||||
|
||||
echo $this->getName() . " initialization done.\n";
|
||||
echo $this->getName() . " site configured to run under " . $this->getHttpHost() . ":" .$this->getHttpPort() . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
26
pgo/cases/symfony_demo/nginx.partial.conf
Normal file
26
pgo/cases/symfony_demo/nginx.partial.conf
Normal file
@@ -0,0 +1,26 @@
|
||||
server {
|
||||
listen PHP_SDK_PGO_SYMFONY_DEMO_HTTP_PORT;
|
||||
server_name PHP_SDK_PGO_SYMFONY_DEMO_HTTP_HOST;
|
||||
|
||||
root PHP_SDK_PGO_SYMFONY_DEMO_DOCROOT;
|
||||
index index.html index.htm index.php;
|
||||
|
||||
# symfony
|
||||
location / {
|
||||
try_files $uri /app.php$is_args$args;
|
||||
}
|
||||
|
||||
location ~ ^/app\.php(/|$) {
|
||||
fastcgi_pass PHP_SDK_PGO_PHP_FCGI_HOST:PHP_SDK_PGO_PHP_FCGI_PORT;
|
||||
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
fastcgi_param DOCUMENT_ROOT $realpath_root;
|
||||
#internal;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
6
pgo/cases/symfony_demo/phpsdk_pgo.json
Normal file
6
pgo/cases/symfony_demo/phpsdk_pgo.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"symfony_phar_url": "https://symfony.com/installer",
|
||||
"type": "web",
|
||||
"srv_http": "nginx",
|
||||
"srv_db": null
|
||||
}
|
||||
138
pgo/cases/symfony_demo_pdo_mysql/TrainingCaseHandler.php
Normal file
138
pgo/cases/symfony_demo_pdo_mysql/TrainingCaseHandler.php
Normal file
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
namespace symfony_demo_pdo_mysql;
|
||||
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\PHP;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool;
|
||||
|
||||
class TrainingCaseHandler extends Abstracts\TrainingCase implements Interfaces\TrainingCase
|
||||
{
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $nginx;
|
||||
protected $maria;
|
||||
protected $php;
|
||||
protected $max_runs = 4;
|
||||
|
||||
public function __construct(Config $conf, ?Interfaces\Server $nginx, ?Interfaces\Server\DB $srv_db)
|
||||
{
|
||||
if (!$nginx) {
|
||||
throw new Exception("Invalid NGINX object");
|
||||
}
|
||||
|
||||
$this->conf = $conf;
|
||||
$this->base = $this->conf->getCaseWorkDir($this->getName());
|
||||
$this->nginx = $nginx;
|
||||
$this->maria = $srv_db;
|
||||
$this->php = $nginx->getPhp();
|
||||
}
|
||||
|
||||
public function getName() : string
|
||||
{
|
||||
return __NAMESPACE__;
|
||||
}
|
||||
|
||||
public function getJobFilename() : string
|
||||
{
|
||||
return $this->conf->getJobDir() . DIRECTORY_SEPARATOR . $this->getName() . ".txt";
|
||||
}
|
||||
|
||||
protected function getToolFn() : string
|
||||
{
|
||||
return $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "composer.phar";
|
||||
}
|
||||
|
||||
protected function setupDist() : void
|
||||
{
|
||||
$case_dir = $this->conf->getCasesTplDir($this->getName());
|
||||
|
||||
if (!is_dir($this->conf->getCaseWorkDir($this->getName()))) {
|
||||
echo "Setting up in '{$this->base}'\n";
|
||||
|
||||
$ver = $this->conf->getSectionItem($this->getName(), "symfony_demo_version");
|
||||
$php = new PHP\CLI($this->conf);
|
||||
$php->exec($this->getToolFn() . " create-project symfony/symfony-demo " . $this->base . " " . $ver);
|
||||
|
||||
copy("$case_dir/env.tpl", "{$this->base}/.env");
|
||||
copy("$case_dir/doctrine.yaml", "{$this->base}/config/packages/doctrine.yaml");
|
||||
unset($php);
|
||||
}
|
||||
|
||||
$this->maria->up();
|
||||
|
||||
$this->maria->query("DROP DATABASE IF EXISTS " . $this->getName());
|
||||
$this->maria->query("CREATE DATABASE " . $this->getName());
|
||||
|
||||
$this->maria->import("$case_dir/blog.mysql", $this->getName());
|
||||
|
||||
$this->maria->down(true);
|
||||
|
||||
$port = $this->getHttpPort();
|
||||
$host = $this->getHttpHost();
|
||||
|
||||
$vars = array(
|
||||
$this->conf->buildTplVarName($this->getName(), "docroot") => str_replace("\\", "/", $this->base . DIRECTORY_SEPARATOR . "public"),
|
||||
);
|
||||
$tpl_fn = $this->conf->getCasesTplDir($this->getName()) . DIRECTORY_SEPARATOR . "nginx.partial.conf";
|
||||
$this->nginx->addServer($tpl_fn, $vars);
|
||||
}
|
||||
|
||||
public function setupUrls()
|
||||
{
|
||||
$this->maria->up();
|
||||
$this->nginx->up();
|
||||
|
||||
$url = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort() . "/en/blog/";
|
||||
$s = file_get_contents($url);
|
||||
|
||||
echo "Generating training urls.\n";
|
||||
|
||||
$lst = array();
|
||||
if (preg_match_all(", href=\"([^\"]+)\",", $s, $m)) {
|
||||
foreach ($m[1] as $u) {
|
||||
if (strlen($u) >= 2 && "/" == $u[0] && "/" != $u[1] && !in_array(substr($u, -3), array("css", "xml", "ico"))) {
|
||||
$ur = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort() . $u;
|
||||
if (!in_array($ur, $lst) && $this->probeUrl($ur)) {
|
||||
$lst[] = $ur;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($lst)) {
|
||||
printf("\033[31m WARNING: Training URL list is empty, check the regex and the possible previous error messages!\033[0m\n");
|
||||
}
|
||||
|
||||
$this->nginx->down(true);
|
||||
$this->maria->down(true);
|
||||
|
||||
$fn = $this->getJobFilename();
|
||||
$s = implode("\n", $lst);
|
||||
if (strlen($s) !== file_put_contents($fn, $s)) {
|
||||
throw new Exception("Couldn't write '$fn'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function prepareInit(Tool\PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
/*$url = $this->conf->getSectionItem($this->getName(), "symfony_phar_url");
|
||||
$pw->fetch($url, $this->getToolFn(), $force);*/
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->getName() . ".\n";
|
||||
|
||||
$this->setupDist();
|
||||
$this->setupUrls();
|
||||
|
||||
echo $this->getName() . " initialization done.\n";
|
||||
echo $this->getName() . " site configured to run under " . $this->getHttpHost() . ":" .$this->getHttpPort() . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
293
pgo/cases/symfony_demo_pdo_mysql/blog.mysql
Normal file
293
pgo/cases/symfony_demo_pdo_mysql/blog.mysql
Normal file
@@ -0,0 +1,293 @@
|
||||
CREATE TABLE symfony_demo_comment (id INTEGER NOT NULL PRIMARY KEY, post_id INTEGER NOT NULL, author_id INTEGER NOT NULL, content TEXT NOT NULL, published_at DATETIME NOT NULL );
|
||||
INSERT INTO symfony_demo_comment VALUES(1,1,3,'Eros diam egestas libero eu vulputate risus. Aliquam sodales odio id eleifend tristique. Nulla porta lobortis ligula vel egestas. Eposs sunt solems de superbus fortis. Sunt torquises imitari velox mirabilis medicinaes. Lorem ipsum dolor sit amet consectetur adipiscing elit. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(2,1,3,'Curabitur aliquam euismod dolor non ornare. Mauris dapibus risus quis suscipit vulputate. Pellentesque et sapien pulvinar consectetur. Ut suscipit posuere justo at vulputate. Nunc viverra elit ac laoreet suscipit. Aliquam sodales odio id eleifend tristique. Vae humani generis. Silva de secundus galatae demitto quadra. Ubi est barbatus nix.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(3,1,3,'Sunt accentores vitare salvus flavum parses. Urna nisl sollicitudin id varius orci quam id turpis. Potus sensim ad ferox abnoba. Silva de secundus galatae demitto quadra. Eros diam egestas libero eu vulputate risus. Pellentesque et sapien pulvinar consectetur.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(4,1,3,'Ut eleifend mauris et risus ultrices egestas. Era brevis ratione est. Potus sensim ad ferox abnoba. Nunc viverra elit ac laoreet suscipit. Ut suscipit posuere justo at vulputate. Teres talis saepe tractare de camerarius flavum sensorem. Aliquam sodales odio id eleifend tristique. Sunt seculaes transferre talis camerarius fluctuies. Sunt torquises imitari velox mirabilis medicinaes. Eposs sunt solems de superbus fortis. Sunt accentores vitare salvus flavum parses.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(5,1,3,'Diatrias tolerare tanquam noster caesium. Pellentesque vitae velit ex. Ubi est barbatus nix. Sunt seculaes transferre talis camerarius fluctuies. Bassus fatalis classiss virtualiter transferre de flavum. Sunt torquises imitari velox mirabilis medicinaes. Silva de secundus galatae demitto quadra. Ut eleifend mauris et risus ultrices egestas.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(6,2,3,'Mauris dapibus risus quis suscipit vulputate. Diatrias tolerare tanquam noster caesium. Era brevis ratione est. Nunc viverra elit ac laoreet suscipit. Sunt seculaes transferre talis camerarius fluctuies. Ubi est barbatus nix. Ut eleifend mauris et risus ultrices egestas. Pellentesque et sapien pulvinar consectetur. Sunt torquises imitari velox mirabilis medicinaes.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(7,2,3,'Ut suscipit posuere justo at vulputate. Eposs sunt solems de superbus fortis. Mauris dapibus risus quis suscipit vulputate. Teres talis saepe tractare de camerarius flavum sensorem. Sunt torquises imitari velox mirabilis medicinaes. Ubi est audax amicitia. Vae humani generis. Bassus fatalis classiss virtualiter transferre de flavum. Ubi est barbatus nix.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(8,2,3,'Abnobas sunt hilotaes de placidus vita. Teres talis saepe tractare de camerarius flavum sensorem. Diatrias tolerare tanquam noster caesium. Ubi est barbatus nix. Nunc viverra elit ac laoreet suscipit. Sunt seculaes transferre talis camerarius fluctuies. Mauris dapibus risus quis suscipit vulputate. Vae humani generis. Urna nisl sollicitudin id varius orci quam id turpis. Ubi est audax amicitia.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(9,2,3,'Silva de secundus galatae demitto quadra. Abnobas sunt hilotaes de placidus vita. Mauris dapibus risus quis suscipit vulputate. Urna nisl sollicitudin id varius orci quam id turpis. Vae humani generis. Pellentesque et sapien pulvinar consectetur. Sunt accentores vitare salvus flavum parses. Pellentesque vitae velit ex. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(10,2,3,'Nulla porta lobortis ligula vel egestas. Pellentesque et sapien pulvinar consectetur. Ut suscipit posuere justo at vulputate. Teres talis saepe tractare de camerarius flavum sensorem. Potus sensim ad ferox abnoba. Lorem ipsum dolor sit amet consectetur adipiscing elit. Ubi est audax amicitia. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(11,3,3,'Sunt torquises imitari velox mirabilis medicinaes. Aliquam sodales odio id eleifend tristique. Nulla porta lobortis ligula vel egestas. Curabitur aliquam euismod dolor non ornare. Pellentesque vitae velit ex. Mauris dapibus risus quis suscipit vulputate. Ut suscipit posuere justo at vulputate. Ubi est barbatus nix. Eposs sunt solems de superbus fortis.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(12,3,3,'Pellentesque vitae velit ex. Urna nisl sollicitudin id varius orci quam id turpis. Ut eleifend mauris et risus ultrices egestas. Silva de secundus galatae demitto quadra. Diatrias tolerare tanquam noster caesium. Mineralis persuadere omnes finises desiderium. Aliquam sodales odio id eleifend tristique. Nulla porta lobortis ligula vel egestas. Vae humani generis.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(13,3,3,'Silva de secundus galatae demitto quadra. Pellentesque vitae velit ex. Ubi est audax amicitia. Mauris dapibus risus quis suscipit vulputate. Sunt torquises imitari velox mirabilis medicinaes. Pellentesque et sapien pulvinar consectetur. Teres talis saepe tractare de camerarius flavum sensorem. Vae humani generis. Aliquam sodales odio id eleifend tristique. Ubi est barbatus nix.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(14,3,3,'Mineralis persuadere omnes finises desiderium. Ubi est barbatus nix. Eros diam egestas libero eu vulputate risus. Morbi tempus commodo mattis. Eposs sunt solems de superbus fortis. Potus sensim ad ferox abnoba. Pellentesque vitae velit ex. Nunc viverra elit ac laoreet suscipit. Bassus fatalis classiss virtualiter transferre de flavum. Pellentesque et sapien pulvinar consectetur. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(15,3,3,'Nulla porta lobortis ligula vel egestas. Eros diam egestas libero eu vulputate risus. Sunt accentores vitare salvus flavum parses. Ut eleifend mauris et risus ultrices egestas. Mineralis persuadere omnes finises desiderium. Vae humani generis.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(16,4,3,'Urna nisl sollicitudin id varius orci quam id turpis. Silva de secundus galatae demitto quadra. Ubi est barbatus nix. Morbi tempus commodo mattis. Ut suscipit posuere justo at vulputate. Nunc viverra elit ac laoreet suscipit. Ut eleifend mauris et risus ultrices egestas. Sunt seculaes transferre talis camerarius fluctuies. Potus sensim ad ferox abnoba.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(17,4,3,'Ut suscipit posuere justo at vulputate. Era brevis ratione est. Pellentesque et sapien pulvinar consectetur. Potus sensim ad ferox abnoba. Nulla porta lobortis ligula vel egestas. Aliquam sodales odio id eleifend tristique. Sunt seculaes transferre talis camerarius fluctuies. Sunt accentores vitare salvus flavum parses. Lorem ipsum dolor sit amet consectetur adipiscing elit. Eposs sunt solems de superbus fortis. Ut eleifend mauris et risus ultrices egestas.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(18,4,3,'Silva de secundus galatae demitto quadra. Aliquam sodales odio id eleifend tristique. Sed varius a risus eget aliquam. Bassus fatalis classiss virtualiter transferre de flavum. Pellentesque vitae velit ex. Mauris dapibus risus quis suscipit vulputate. Vae humani generis. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(19,4,3,'Curabitur aliquam euismod dolor non ornare. Pellentesque et sapien pulvinar consectetur. Nunc viverra elit ac laoreet suscipit. Ubi est audax amicitia. Bassus fatalis classiss virtualiter transferre de flavum. Eposs sunt solems de superbus fortis. Sed varius a risus eget aliquam. Sunt seculaes transferre talis camerarius fluctuies. Potus sensim ad ferox abnoba.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(20,4,3,'Nulla porta lobortis ligula vel egestas. Ubi est audax amicitia. Sunt torquises imitari velox mirabilis medicinaes. Eposs sunt solems de superbus fortis. Morbi tempus commodo mattis. Mineralis persuadere omnes finises desiderium. Aliquam sodales odio id eleifend tristique.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(21,5,3,'Sunt torquises imitari velox mirabilis medicinaes. Sunt accentores vitare salvus flavum parses. Nulla porta lobortis ligula vel egestas. Mineralis persuadere omnes finises desiderium. Diatrias tolerare tanquam noster caesium. Morbi tempus commodo mattis. Sunt seculaes transferre talis camerarius fluctuies. Mauris dapibus risus quis suscipit vulputate. Curabitur aliquam euismod dolor non ornare. Pellentesque et sapien pulvinar consectetur. Ut eleifend mauris et risus ultrices egestas.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(22,5,3,'Urna nisl sollicitudin id varius orci quam id turpis. Sunt torquises imitari velox mirabilis medicinaes. Ut suscipit posuere justo at vulputate. Ut eleifend mauris et risus ultrices egestas. Sunt accentores vitare salvus flavum parses. Diatrias tolerare tanquam noster caesium. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(23,5,3,'Teres talis saepe tractare de camerarius flavum sensorem. Nunc viverra elit ac laoreet suscipit. Sunt torquises imitari velox mirabilis medicinaes. Silva de secundus galatae demitto quadra. Sunt seculaes transferre talis camerarius fluctuies. Eposs sunt solems de superbus fortis.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(24,5,3,'Urna nisl sollicitudin id varius orci quam id turpis. Nulla porta lobortis ligula vel egestas. Era brevis ratione est. Vae humani generis. Sunt seculaes transferre talis camerarius fluctuies. Pellentesque vitae velit ex. Potus sensim ad ferox abnoba. Lorem ipsum dolor sit amet consectetur adipiscing elit.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(25,5,3,'Teres talis saepe tractare de camerarius flavum sensorem. Sunt torquises imitari velox mirabilis medicinaes. Mauris dapibus risus quis suscipit vulputate. Pellentesque vitae velit ex. Sunt accentores vitare salvus flavum parses. Eposs sunt solems de superbus fortis. Curabitur aliquam euismod dolor non ornare. Sed varius a risus eget aliquam. Eros diam egestas libero eu vulputate risus. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(26,6,3,'Era brevis ratione est. Ut suscipit posuere justo at vulputate. Vae humani generis. Eposs sunt solems de superbus fortis. Lorem ipsum dolor sit amet consectetur adipiscing elit. Ubi est barbatus nix. Sunt accentores vitare salvus flavum parses. Bassus fatalis classiss virtualiter transferre de flavum. Pellentesque et sapien pulvinar consectetur. Morbi tempus commodo mattis. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(27,6,3,'Silva de secundus galatae demitto quadra. Ut suscipit posuere justo at vulputate. Teres talis saepe tractare de camerarius flavum sensorem. Sed varius a risus eget aliquam. Urna nisl sollicitudin id varius orci quam id turpis. Nunc viverra elit ac laoreet suscipit. Abnobas sunt hilotaes de placidus vita. Pellentesque et sapien pulvinar consectetur.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(28,6,3,'Pellentesque et sapien pulvinar consectetur. Lorem ipsum dolor sit amet consectetur adipiscing elit. Sunt accentores vitare salvus flavum parses. Ubi est audax amicitia. Sed varius a risus eget aliquam. In hac habitasse platea dictumst. Diatrias tolerare tanquam noster caesium. Pellentesque vitae velit ex. Nulla porta lobortis ligula vel egestas. Aliquam sodales odio id eleifend tristique. Vae humani generis.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(29,6,3,'Diatrias tolerare tanquam noster caesium. Ut eleifend mauris et risus ultrices egestas. Curabitur aliquam euismod dolor non ornare. Vae humani generis. In hac habitasse platea dictumst. Potus sensim ad ferox abnoba. Silva de secundus galatae demitto quadra. Sed varius a risus eget aliquam. Eposs sunt solems de superbus fortis. Pellentesque vitae velit ex. Bassus fatalis classiss virtualiter transferre de flavum. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(30,6,3,'Era brevis ratione est. Mineralis persuadere omnes finises desiderium. Ut suscipit posuere justo at vulputate. Eposs sunt solems de superbus fortis. Sunt accentores vitare salvus flavum parses. Aliquam sodales odio id eleifend tristique.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(31,7,3,'Aliquam sodales odio id eleifend tristique. Curabitur aliquam euismod dolor non ornare. Nunc viverra elit ac laoreet suscipit. Teres talis saepe tractare de camerarius flavum sensorem. Eposs sunt solems de superbus fortis. Sed varius a risus eget aliquam. Ubi est barbatus nix. Sunt seculaes transferre talis camerarius fluctuies. Abnobas sunt hilotaes de placidus vita. Era brevis ratione est. Potus sensim ad ferox abnoba. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(32,7,3,'Sunt torquises imitari velox mirabilis medicinaes. Pellentesque vitae velit ex. Ubi est audax amicitia. Potus sensim ad ferox abnoba. Ut suscipit posuere justo at vulputate. Morbi tempus commodo mattis. Teres talis saepe tractare de camerarius flavum sensorem.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(33,7,3,'Eros diam egestas libero eu vulputate risus. Nulla porta lobortis ligula vel egestas. Mineralis persuadere omnes finises desiderium. Morbi tempus commodo mattis. Pellentesque et sapien pulvinar consectetur. Curabitur aliquam euismod dolor non ornare. Sunt accentores vitare salvus flavum parses. In hac habitasse platea dictumst. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(34,7,3,'Nulla porta lobortis ligula vel egestas. Nunc viverra elit ac laoreet suscipit. Mauris dapibus risus quis suscipit vulputate. Sunt accentores vitare salvus flavum parses. In hac habitasse platea dictumst. Eros diam egestas libero eu vulputate risus. Sed varius a risus eget aliquam. Ut suscipit posuere justo at vulputate. Curabitur aliquam euismod dolor non ornare. Lorem ipsum dolor sit amet consectetur adipiscing elit. Ubi est audax amicitia.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(35,7,3,'Potus sensim ad ferox abnoba. Abnobas sunt hilotaes de placidus vita. Sunt accentores vitare salvus flavum parses. Eposs sunt solems de superbus fortis. Nulla porta lobortis ligula vel egestas. Ubi est barbatus nix. Aliquam sodales odio id eleifend tristique. Morbi tempus commodo mattis. Bassus fatalis classiss virtualiter transferre de flavum. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(36,8,3,'Urna nisl sollicitudin id varius orci quam id turpis. Pellentesque et sapien pulvinar consectetur. Ut eleifend mauris et risus ultrices egestas. Sunt seculaes transferre talis camerarius fluctuies. Sunt accentores vitare salvus flavum parses. Lorem ipsum dolor sit amet consectetur adipiscing elit. Potus sensim ad ferox abnoba. Nulla porta lobortis ligula vel egestas. Sed varius a risus eget aliquam.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(37,8,3,'Morbi tempus commodo mattis. Pellentesque vitae velit ex. Pellentesque et sapien pulvinar consectetur. Silva de secundus galatae demitto quadra. Eposs sunt solems de superbus fortis. Ut suscipit posuere justo at vulputate. Era brevis ratione est. Abnobas sunt hilotaes de placidus vita. In hac habitasse platea dictumst. Sed varius a risus eget aliquam. Ubi est barbatus nix.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(38,8,3,'Silva de secundus galatae demitto quadra. Morbi tempus commodo mattis. Curabitur aliquam euismod dolor non ornare. Ut suscipit posuere justo at vulputate. Bassus fatalis classiss virtualiter transferre de flavum. Aliquam sodales odio id eleifend tristique. Sunt accentores vitare salvus flavum parses. Sed varius a risus eget aliquam. Nulla porta lobortis ligula vel egestas. Urna nisl sollicitudin id varius orci quam id turpis. Teres talis saepe tractare de camerarius flavum sensorem.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(39,8,3,'Lorem ipsum dolor sit amet consectetur adipiscing elit. Mauris dapibus risus quis suscipit vulputate. Vae humani generis. Bassus fatalis classiss virtualiter transferre de flavum. Eros diam egestas libero eu vulputate risus. Pellentesque vitae velit ex. In hac habitasse platea dictumst.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(40,8,3,'Mineralis persuadere omnes finises desiderium. Eros diam egestas libero eu vulputate risus. Urna nisl sollicitudin id varius orci quam id turpis. Pellentesque vitae velit ex. Ut eleifend mauris et risus ultrices egestas. Sunt accentores vitare salvus flavum parses. Sunt seculaes transferre talis camerarius fluctuies. Teres talis saepe tractare de camerarius flavum sensorem. Mauris dapibus risus quis suscipit vulputate.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(41,9,3,'Pellentesque vitae velit ex. Vae humani generis. Lorem ipsum dolor sit amet consectetur adipiscing elit. Bassus fatalis classiss virtualiter transferre de flavum. Urna nisl sollicitudin id varius orci quam id turpis. Sunt torquises imitari velox mirabilis medicinaes. Ubi est audax amicitia. Nulla porta lobortis ligula vel egestas. Ubi est barbatus nix.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(42,9,3,'Era brevis ratione est. Mauris dapibus risus quis suscipit vulputate. Eposs sunt solems de superbus fortis. Sunt torquises imitari velox mirabilis medicinaes. Ubi est audax amicitia. Aliquam sodales odio id eleifend tristique. Nunc viverra elit ac laoreet suscipit. Bassus fatalis classiss virtualiter transferre de flavum. Abnobas sunt hilotaes de placidus vita.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(43,9,3,'Mauris dapibus risus quis suscipit vulputate. Ubi est barbatus nix. Abnobas sunt hilotaes de placidus vita. Eposs sunt solems de superbus fortis. Teres talis saepe tractare de camerarius flavum sensorem. Era brevis ratione est. Silva de secundus galatae demitto quadra.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(44,9,3,'Eros diam egestas libero eu vulputate risus. Vae humani generis. Bassus fatalis classiss virtualiter transferre de flavum. Ut eleifend mauris et risus ultrices egestas. Pellentesque et sapien pulvinar consectetur. Potus sensim ad ferox abnoba. Abnobas sunt hilotaes de placidus vita. Mineralis persuadere omnes finises desiderium. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(45,9,3,'Aliquam sodales odio id eleifend tristique. Teres talis saepe tractare de camerarius flavum sensorem. Morbi tempus commodo mattis. Eposs sunt solems de superbus fortis. Abnobas sunt hilotaes de placidus vita. Sunt torquises imitari velox mirabilis medicinaes. Eros diam egestas libero eu vulputate risus.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(46,10,3,'Era brevis ratione est. Curabitur aliquam euismod dolor non ornare. Diatrias tolerare tanquam noster caesium. Ubi est barbatus nix. Sed varius a risus eget aliquam. Urna nisl sollicitudin id varius orci quam id turpis. Ut suscipit posuere justo at vulputate. Vae humani generis. Sunt accentores vitare salvus flavum parses. Potus sensim ad ferox abnoba.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(47,10,3,'Ut suscipit posuere justo at vulputate. Lorem ipsum dolor sit amet consectetur adipiscing elit. Silva de secundus galatae demitto quadra. Pellentesque vitae velit ex. Aliquam sodales odio id eleifend tristique. Urna nisl sollicitudin id varius orci quam id turpis. Curabitur aliquam euismod dolor non ornare. Sunt torquises imitari velox mirabilis medicinaes. Pellentesque et sapien pulvinar consectetur. Eros diam egestas libero eu vulputate risus. Vae humani generis. Morbi tempus commodo mattis.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(48,10,3,'Sunt accentores vitare salvus flavum parses. Mineralis persuadere omnes finises desiderium. Vae humani generis. Silva de secundus galatae demitto quadra. Pellentesque et sapien pulvinar consectetur. Ut suscipit posuere justo at vulputate. Teres talis saepe tractare de camerarius flavum sensorem. Urna nisl sollicitudin id varius orci quam id turpis. Morbi tempus commodo mattis. Era brevis ratione est.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(49,10,3,'Ut suscipit posuere justo at vulputate. Silva de secundus galatae demitto quadra. In hac habitasse platea dictumst. Bassus fatalis classiss virtualiter transferre de flavum. Mineralis persuadere omnes finises desiderium. Sed varius a risus eget aliquam. Eros diam egestas libero eu vulputate risus. Vae humani generis. Ut eleifend mauris et risus ultrices egestas. Urna nisl sollicitudin id varius orci quam id turpis. Morbi tempus commodo mattis. Pellentesque vitae velit ex.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(50,10,3,'Era brevis ratione est. Bassus fatalis classiss virtualiter transferre de flavum. Eros diam egestas libero eu vulputate risus. Urna nisl sollicitudin id varius orci quam id turpis. Nulla porta lobortis ligula vel egestas. Vae humani generis.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(51,11,3,'Ut suscipit posuere justo at vulputate. Sed varius a risus eget aliquam. Bassus fatalis classiss virtualiter transferre de flavum. Morbi tempus commodo mattis. Era brevis ratione est. Silva de secundus galatae demitto quadra. Sunt torquises imitari velox mirabilis medicinaes. Curabitur aliquam euismod dolor non ornare. Diatrias tolerare tanquam noster caesium. In hac habitasse platea dictumst. Ubi est barbatus nix. Ubi est audax amicitia. Pellentesque et sapien pulvinar consectetur.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(52,11,3,'In hac habitasse platea dictumst. Curabitur aliquam euismod dolor non ornare. Nulla porta lobortis ligula vel egestas. Nunc viverra elit ac laoreet suscipit. Eros diam egestas libero eu vulputate risus. Era brevis ratione est. Abnobas sunt hilotaes de placidus vita. Urna nisl sollicitudin id varius orci quam id turpis.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(53,11,3,'Potus sensim ad ferox abnoba. In hac habitasse platea dictumst. Aliquam sodales odio id eleifend tristique. Ut suscipit posuere justo at vulputate. Abnobas sunt hilotaes de placidus vita. Urna nisl sollicitudin id varius orci quam id turpis. Teres talis saepe tractare de camerarius flavum sensorem. Pellentesque vitae velit ex. Silva de secundus galatae demitto quadra. Morbi tempus commodo mattis. Curabitur aliquam euismod dolor non ornare.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(54,11,3,'Urna nisl sollicitudin id varius orci quam id turpis. Pellentesque vitae velit ex. Bassus fatalis classiss virtualiter transferre de flavum. Diatrias tolerare tanquam noster caesium. Ubi est audax amicitia. Sed varius a risus eget aliquam. Morbi tempus commodo mattis. Sunt accentores vitare salvus flavum parses.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(55,11,3,'Ubi est audax amicitia. Ut eleifend mauris et risus ultrices egestas. Diatrias tolerare tanquam noster caesium. Aliquam sodales odio id eleifend tristique. Ut suscipit posuere justo at vulputate. Sed varius a risus eget aliquam. Bassus fatalis classiss virtualiter transferre de flavum. Lorem ipsum dolor sit amet consectetur adipiscing elit. Era brevis ratione est.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(56,12,3,'Ubi est audax amicitia. Mauris dapibus risus quis suscipit vulputate. Eros diam egestas libero eu vulputate risus. Sunt torquises imitari velox mirabilis medicinaes. Ut suscipit posuere justo at vulputate. Eposs sunt solems de superbus fortis. Ubi est barbatus nix. Morbi tempus commodo mattis. Nunc viverra elit ac laoreet suscipit. Teres talis saepe tractare de camerarius flavum sensorem.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(57,12,3,'Sunt seculaes transferre talis camerarius fluctuies. Urna nisl sollicitudin id varius orci quam id turpis. Nunc viverra elit ac laoreet suscipit. Pellentesque vitae velit ex. Bassus fatalis classiss virtualiter transferre de flavum. Eros diam egestas libero eu vulputate risus. Sunt torquises imitari velox mirabilis medicinaes. Mineralis persuadere omnes finises desiderium. Sunt accentores vitare salvus flavum parses. Morbi tempus commodo mattis.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(58,12,3,'In hac habitasse platea dictumst. Sunt seculaes transferre talis camerarius fluctuies. Ubi est audax amicitia. Potus sensim ad ferox abnoba. Ut suscipit posuere justo at vulputate. Pellentesque et sapien pulvinar consectetur. Eros diam egestas libero eu vulputate risus. Curabitur aliquam euismod dolor non ornare. Ut eleifend mauris et risus ultrices egestas. Mineralis persuadere omnes finises desiderium. Diatrias tolerare tanquam noster caesium. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(59,12,3,'In hac habitasse platea dictumst. Urna nisl sollicitudin id varius orci quam id turpis. Morbi tempus commodo mattis. Sunt torquises imitari velox mirabilis medicinaes. Ubi est barbatus nix. Nulla porta lobortis ligula vel egestas. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(60,12,3,'Diatrias tolerare tanquam noster caesium. Ut suscipit posuere justo at vulputate. Ubi est barbatus nix. Potus sensim ad ferox abnoba. Mauris dapibus risus quis suscipit vulputate. Nunc viverra elit ac laoreet suscipit. Morbi tempus commodo mattis. Curabitur aliquam euismod dolor non ornare. Sunt seculaes transferre talis camerarius fluctuies. Ut eleifend mauris et risus ultrices egestas. Pellentesque et sapien pulvinar consectetur. Aliquam sodales odio id eleifend tristique. Vae humani generis.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(61,13,3,'Vae humani generis. Ubi est barbatus nix. Eposs sunt solems de superbus fortis. Sunt torquises imitari velox mirabilis medicinaes. Sunt seculaes transferre talis camerarius fluctuies. Pellentesque vitae velit ex. Abnobas sunt hilotaes de placidus vita.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(62,13,3,'Curabitur aliquam euismod dolor non ornare. Sunt accentores vitare salvus flavum parses. Ubi est audax amicitia. Nunc viverra elit ac laoreet suscipit. Teres talis saepe tractare de camerarius flavum sensorem. Nulla porta lobortis ligula vel egestas. Pellentesque vitae velit ex. Morbi tempus commodo mattis. Mineralis persuadere omnes finises desiderium.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(63,13,3,'Ubi est audax amicitia. Sed varius a risus eget aliquam. In hac habitasse platea dictumst. Era brevis ratione est. Sunt accentores vitare salvus flavum parses. Teres talis saepe tractare de camerarius flavum sensorem. Sunt seculaes transferre talis camerarius fluctuies. Ut eleifend mauris et risus ultrices egestas. Mineralis persuadere omnes finises desiderium. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(64,13,3,'Abnobas sunt hilotaes de placidus vita. In hac habitasse platea dictumst. Aliquam sodales odio id eleifend tristique. Diatrias tolerare tanquam noster caesium. Urna nisl sollicitudin id varius orci quam id turpis. Vae humani generis. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(65,13,3,'Mineralis persuadere omnes finises desiderium. Ubi est barbatus nix. Sunt seculaes transferre talis camerarius fluctuies. Vae humani generis. Pellentesque vitae velit ex. Diatrias tolerare tanquam noster caesium. Pellentesque et sapien pulvinar consectetur. Ubi est audax amicitia. Urna nisl sollicitudin id varius orci quam id turpis. Teres talis saepe tractare de camerarius flavum sensorem. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(66,14,3,'Urna nisl sollicitudin id varius orci quam id turpis. Sunt torquises imitari velox mirabilis medicinaes. Vae humani generis. Era brevis ratione est. Sunt accentores vitare salvus flavum parses. Ubi est barbatus nix.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(67,14,3,'Mauris dapibus risus quis suscipit vulputate. Mineralis persuadere omnes finises desiderium. Sunt accentores vitare salvus flavum parses. Nunc viverra elit ac laoreet suscipit. Potus sensim ad ferox abnoba. In hac habitasse platea dictumst. Diatrias tolerare tanquam noster caesium. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(68,14,3,'Diatrias tolerare tanquam noster caesium. Nunc viverra elit ac laoreet suscipit. Pellentesque vitae velit ex. Bassus fatalis classiss virtualiter transferre de flavum. Ubi est barbatus nix. Ut eleifend mauris et risus ultrices egestas. Potus sensim ad ferox abnoba. Era brevis ratione est. Urna nisl sollicitudin id varius orci quam id turpis. Sunt accentores vitare salvus flavum parses. In hac habitasse platea dictumst. Ubi est audax amicitia.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(69,14,3,'Potus sensim ad ferox abnoba. Silva de secundus galatae demitto quadra. Mineralis persuadere omnes finises desiderium. Diatrias tolerare tanquam noster caesium. Nunc viverra elit ac laoreet suscipit. Era brevis ratione est. Teres talis saepe tractare de camerarius flavum sensorem. Abnobas sunt hilotaes de placidus vita. Sunt torquises imitari velox mirabilis medicinaes.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(70,14,3,'Nulla porta lobortis ligula vel egestas. Curabitur aliquam euismod dolor non ornare. Ut eleifend mauris et risus ultrices egestas. Vae humani generis. Bassus fatalis classiss virtualiter transferre de flavum. In hac habitasse platea dictumst. Silva de secundus galatae demitto quadra. Eros diam egestas libero eu vulputate risus. Ubi est barbatus nix. Pellentesque vitae velit ex. Eposs sunt solems de superbus fortis.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(71,15,3,'Ubi est barbatus nix. Ut suscipit posuere justo at vulputate. Curabitur aliquam euismod dolor non ornare. Sunt torquises imitari velox mirabilis medicinaes. Eposs sunt solems de superbus fortis. Mineralis persuadere omnes finises desiderium. Bassus fatalis classiss virtualiter transferre de flavum.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(72,15,3,'Mauris dapibus risus quis suscipit vulputate. Curabitur aliquam euismod dolor non ornare. Ubi est audax amicitia. Pellentesque vitae velit ex. Pellentesque et sapien pulvinar consectetur. Nulla porta lobortis ligula vel egestas. Ubi est barbatus nix. Teres talis saepe tractare de camerarius flavum sensorem.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(73,15,3,'Ut suscipit posuere justo at vulputate. Vae humani generis. In hac habitasse platea dictumst. Morbi tempus commodo mattis. Urna nisl sollicitudin id varius orci quam id turpis. Silva de secundus galatae demitto quadra. Pellentesque vitae velit ex. Potus sensim ad ferox abnoba. Pellentesque et sapien pulvinar consectetur. Diatrias tolerare tanquam noster caesium. Teres talis saepe tractare de camerarius flavum sensorem. Sunt accentores vitare salvus flavum parses.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(74,15,3,'Sunt torquises imitari velox mirabilis medicinaes. Lorem ipsum dolor sit amet consectetur adipiscing elit. Eposs sunt solems de superbus fortis. Teres talis saepe tractare de camerarius flavum sensorem. Ubi est barbatus nix. Bassus fatalis classiss virtualiter transferre de flavum. Nunc viverra elit ac laoreet suscipit. Sunt accentores vitare salvus flavum parses. Curabitur aliquam euismod dolor non ornare. Aliquam sodales odio id eleifend tristique.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(75,15,3,'Potus sensim ad ferox abnoba. Eposs sunt solems de superbus fortis. Sed varius a risus eget aliquam. Mauris dapibus risus quis suscipit vulputate. Ut suscipit posuere justo at vulputate. Vae humani generis. Eros diam egestas libero eu vulputate risus. Mineralis persuadere omnes finises desiderium. Ubi est barbatus nix. Teres talis saepe tractare de camerarius flavum sensorem.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(76,16,3,'Sunt seculaes transferre talis camerarius fluctuies. In hac habitasse platea dictumst. Ut eleifend mauris et risus ultrices egestas. Sunt torquises imitari velox mirabilis medicinaes. Sunt accentores vitare salvus flavum parses. Ut suscipit posuere justo at vulputate. Ubi est barbatus nix. Silva de secundus galatae demitto quadra. Morbi tempus commodo mattis. Vae humani generis. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(77,16,3,'Teres talis saepe tractare de camerarius flavum sensorem. Ut suscipit posuere justo at vulputate. Curabitur aliquam euismod dolor non ornare. Mineralis persuadere omnes finises desiderium. Eposs sunt solems de superbus fortis. Nunc viverra elit ac laoreet suscipit. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(78,16,3,'Nulla porta lobortis ligula vel egestas. Ut eleifend mauris et risus ultrices egestas. Ubi est barbatus nix. Aliquam sodales odio id eleifend tristique. Eposs sunt solems de superbus fortis. Vae humani generis. Nunc viverra elit ac laoreet suscipit. Curabitur aliquam euismod dolor non ornare. Potus sensim ad ferox abnoba. Pellentesque vitae velit ex. Lorem ipsum dolor sit amet consectetur adipiscing elit. Pellentesque et sapien pulvinar consectetur.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(79,16,3,'Nulla porta lobortis ligula vel egestas. Vae humani generis. Urna nisl sollicitudin id varius orci quam id turpis. Bassus fatalis classiss virtualiter transferre de flavum. Mauris dapibus risus quis suscipit vulputate. Eposs sunt solems de superbus fortis. Pellentesque vitae velit ex. Pellentesque et sapien pulvinar consectetur. Diatrias tolerare tanquam noster caesium. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(80,16,3,'Aliquam sodales odio id eleifend tristique. Ut eleifend mauris et risus ultrices egestas. Nulla porta lobortis ligula vel egestas. Nunc viverra elit ac laoreet suscipit. Sunt seculaes transferre talis camerarius fluctuies. Diatrias tolerare tanquam noster caesium.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(81,17,3,'Mauris dapibus risus quis suscipit vulputate. Potus sensim ad ferox abnoba. Ubi est barbatus nix. Sed varius a risus eget aliquam. Vae humani generis. Eposs sunt solems de superbus fortis. Sunt torquises imitari velox mirabilis medicinaes. Pellentesque vitae velit ex. Bassus fatalis classiss virtualiter transferre de flavum. Ubi est audax amicitia.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(82,17,3,'Aliquam sodales odio id eleifend tristique. Nunc viverra elit ac laoreet suscipit. Sed varius a risus eget aliquam. Sunt torquises imitari velox mirabilis medicinaes. Ut eleifend mauris et risus ultrices egestas. Diatrias tolerare tanquam noster caesium.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(83,17,3,'Sed varius a risus eget aliquam. Mauris dapibus risus quis suscipit vulputate. Curabitur aliquam euismod dolor non ornare. Morbi tempus commodo mattis. Eros diam egestas libero eu vulputate risus. Vae humani generis. Ut eleifend mauris et risus ultrices egestas. Sunt accentores vitare salvus flavum parses. Aliquam sodales odio id eleifend tristique. Diatrias tolerare tanquam noster caesium. Nulla porta lobortis ligula vel egestas. Pellentesque vitae velit ex.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(84,17,3,'Diatrias tolerare tanquam noster caesium. Potus sensim ad ferox abnoba. Lorem ipsum dolor sit amet consectetur adipiscing elit. Ubi est barbatus nix. Pellentesque vitae velit ex. Sunt accentores vitare salvus flavum parses. Aliquam sodales odio id eleifend tristique. Era brevis ratione est. Pellentesque et sapien pulvinar consectetur. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(85,17,3,'Pellentesque et sapien pulvinar consectetur. Urna nisl sollicitudin id varius orci quam id turpis. Lorem ipsum dolor sit amet consectetur adipiscing elit. Curabitur aliquam euismod dolor non ornare. Era brevis ratione est. Ubi est audax amicitia.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(86,18,3,'Silva de secundus galatae demitto quadra. Nulla porta lobortis ligula vel egestas. Ubi est barbatus nix. Sed varius a risus eget aliquam. Bassus fatalis classiss virtualiter transferre de flavum. Eros diam egestas libero eu vulputate risus.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(87,18,3,'Bassus fatalis classiss virtualiter transferre de flavum. Sunt torquises imitari velox mirabilis medicinaes. Pellentesque et sapien pulvinar consectetur. Teres talis saepe tractare de camerarius flavum sensorem. Nulla porta lobortis ligula vel egestas. Ut eleifend mauris et risus ultrices egestas. Nunc viverra elit ac laoreet suscipit. Ubi est barbatus nix. Mauris dapibus risus quis suscipit vulputate. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(88,18,3,'Mineralis persuadere omnes finises desiderium. Pellentesque et sapien pulvinar consectetur. Teres talis saepe tractare de camerarius flavum sensorem. Diatrias tolerare tanquam noster caesium. Morbi tempus commodo mattis. Lorem ipsum dolor sit amet consectetur adipiscing elit. Potus sensim ad ferox abnoba. Mauris dapibus risus quis suscipit vulputate.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(89,18,3,'Ut eleifend mauris et risus ultrices egestas. Bassus fatalis classiss virtualiter transferre de flavum. Mauris dapibus risus quis suscipit vulputate. Mineralis persuadere omnes finises desiderium. Urna nisl sollicitudin id varius orci quam id turpis. Eposs sunt solems de superbus fortis. Sunt torquises imitari velox mirabilis medicinaes. Sunt accentores vitare salvus flavum parses. Abnobas sunt hilotaes de placidus vita. Morbi tempus commodo mattis. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(90,18,3,'Nulla porta lobortis ligula vel egestas. Vae humani generis. Urna nisl sollicitudin id varius orci quam id turpis. Pellentesque et sapien pulvinar consectetur. Ut suscipit posuere justo at vulputate. Sunt seculaes transferre talis camerarius fluctuies. Eros diam egestas libero eu vulputate risus. Nunc viverra elit ac laoreet suscipit. Curabitur aliquam euismod dolor non ornare. Silva de secundus galatae demitto quadra. Morbi tempus commodo mattis.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(91,19,3,'Pellentesque et sapien pulvinar consectetur. Aliquam sodales odio id eleifend tristique. Eposs sunt solems de superbus fortis. Nulla porta lobortis ligula vel egestas. Mineralis persuadere omnes finises desiderium. Bassus fatalis classiss virtualiter transferre de flavum. Vae humani generis.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(92,19,3,'Abnobas sunt hilotaes de placidus vita. Pellentesque vitae velit ex. Eposs sunt solems de superbus fortis. Ubi est audax amicitia. Ut eleifend mauris et risus ultrices egestas. Curabitur aliquam euismod dolor non ornare. Morbi tempus commodo mattis.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(93,19,3,'Sunt seculaes transferre talis camerarius fluctuies. Sunt accentores vitare salvus flavum parses. Ut suscipit posuere justo at vulputate. Sed varius a risus eget aliquam. Nulla porta lobortis ligula vel egestas. Teres talis saepe tractare de camerarius flavum sensorem. Nunc viverra elit ac laoreet suscipit. Vae humani generis. Pellentesque et sapien pulvinar consectetur. Ut eleifend mauris et risus ultrices egestas. Eposs sunt solems de superbus fortis. Ubi est audax amicitia.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(94,19,3,'Sed varius a risus eget aliquam. Eposs sunt solems de superbus fortis. Sunt seculaes transferre talis camerarius fluctuies. Potus sensim ad ferox abnoba. Pellentesque vitae velit ex. Lorem ipsum dolor sit amet consectetur adipiscing elit. Teres talis saepe tractare de camerarius flavum sensorem. Pellentesque et sapien pulvinar consectetur. Era brevis ratione est.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(95,19,3,'Ut suscipit posuere justo at vulputate. Nulla porta lobortis ligula vel egestas. Eposs sunt solems de superbus fortis. Pellentesque vitae velit ex. Pellentesque et sapien pulvinar consectetur. Ut eleifend mauris et risus ultrices egestas.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(96,20,3,'Bassus fatalis classiss virtualiter transferre de flavum. Mauris dapibus risus quis suscipit vulputate. Morbi tempus commodo mattis. Sunt accentores vitare salvus flavum parses. Sunt torquises imitari velox mirabilis medicinaes. Teres talis saepe tractare de camerarius flavum sensorem. Ubi est barbatus nix. Pellentesque et sapien pulvinar consectetur. Sed varius a risus eget aliquam. Eros diam egestas libero eu vulputate risus.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(97,20,3,'Teres talis saepe tractare de camerarius flavum sensorem. Eposs sunt solems de superbus fortis. Nulla porta lobortis ligula vel egestas. Mauris dapibus risus quis suscipit vulputate. Bassus fatalis classiss virtualiter transferre de flavum. Sunt seculaes transferre talis camerarius fluctuies. Mineralis persuadere omnes finises desiderium. Eros diam egestas libero eu vulputate risus.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(98,20,3,'Ut eleifend mauris et risus ultrices egestas. Pellentesque vitae velit ex. Aliquam sodales odio id eleifend tristique. Sunt seculaes transferre talis camerarius fluctuies. Lorem ipsum dolor sit amet consectetur adipiscing elit. Urna nisl sollicitudin id varius orci quam id turpis. Mauris dapibus risus quis suscipit vulputate. Ubi est barbatus nix. Pellentesque et sapien pulvinar consectetur.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(99,20,3,'Nunc viverra elit ac laoreet suscipit. Sed varius a risus eget aliquam. Urna nisl sollicitudin id varius orci quam id turpis. Mineralis persuadere omnes finises desiderium. Morbi tempus commodo mattis. Curabitur aliquam euismod dolor non ornare. Potus sensim ad ferox abnoba. Era brevis ratione est. Sunt accentores vitare salvus flavum parses. Mauris dapibus risus quis suscipit vulputate. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(100,20,3,'Potus sensim ad ferox abnoba. Vae humani generis. Nulla porta lobortis ligula vel egestas. Mineralis persuadere omnes finises desiderium. Pellentesque et sapien pulvinar consectetur. Pellentesque vitae velit ex. Lorem ipsum dolor sit amet consectetur adipiscing elit. Abnobas sunt hilotaes de placidus vita. Teres talis saepe tractare de camerarius flavum sensorem.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(101,21,3,'Pellentesque vitae velit ex. Morbi tempus commodo mattis. Sunt seculaes transferre talis camerarius fluctuies. Bassus fatalis classiss virtualiter transferre de flavum. Ut eleifend mauris et risus ultrices egestas. Sunt torquises imitari velox mirabilis medicinaes. Era brevis ratione est. Sed varius a risus eget aliquam.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(102,21,3,'Pellentesque vitae velit ex. Mineralis persuadere omnes finises desiderium. Sunt seculaes transferre talis camerarius fluctuies. Lorem ipsum dolor sit amet consectetur adipiscing elit. Abnobas sunt hilotaes de placidus vita. In hac habitasse platea dictumst. Aliquam sodales odio id eleifend tristique. Mauris dapibus risus quis suscipit vulputate. Eros diam egestas libero eu vulputate risus. Morbi tempus commodo mattis. Diatrias tolerare tanquam noster caesium.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(103,21,3,'Lorem ipsum dolor sit amet consectetur adipiscing elit. Sunt accentores vitare salvus flavum parses. Eros diam egestas libero eu vulputate risus. Teres talis saepe tractare de camerarius flavum sensorem. Morbi tempus commodo mattis. Ut eleifend mauris et risus ultrices egestas. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(104,21,3,'Sunt accentores vitare salvus flavum parses. Aliquam sodales odio id eleifend tristique. Nunc viverra elit ac laoreet suscipit. Pellentesque et sapien pulvinar consectetur. Pellentesque vitae velit ex. Sunt torquises imitari velox mirabilis medicinaes.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(105,21,3,'Nunc viverra elit ac laoreet suscipit. Sunt accentores vitare salvus flavum parses. Curabitur aliquam euismod dolor non ornare. Pellentesque vitae velit ex. Ut suscipit posuere justo at vulputate. Vae humani generis. Ubi est audax amicitia. Eposs sunt solems de superbus fortis. Urna nisl sollicitudin id varius orci quam id turpis. Abnobas sunt hilotaes de placidus vita.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(106,22,3,'Pellentesque et sapien pulvinar consectetur. Bassus fatalis classiss virtualiter transferre de flavum. Ut eleifend mauris et risus ultrices egestas. Teres talis saepe tractare de camerarius flavum sensorem. Diatrias tolerare tanquam noster caesium.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(107,22,3,'Aliquam sodales odio id eleifend tristique. Eposs sunt solems de superbus fortis. Era brevis ratione est. Vae humani generis. Diatrias tolerare tanquam noster caesium. Nulla porta lobortis ligula vel egestas. Lorem ipsum dolor sit amet consectetur adipiscing elit. Abnobas sunt hilotaes de placidus vita. Ubi est audax amicitia. Sed varius a risus eget aliquam. Morbi tempus commodo mattis.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(108,22,3,'Eros diam egestas libero eu vulputate risus. Silva de secundus galatae demitto quadra. Ut eleifend mauris et risus ultrices egestas. Sunt seculaes transferre talis camerarius fluctuies. Pellentesque et sapien pulvinar consectetur. Vae humani generis. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(109,22,3,'Teres talis saepe tractare de camerarius flavum sensorem. Pellentesque et sapien pulvinar consectetur. Diatrias tolerare tanquam noster caesium. Sunt torquises imitari velox mirabilis medicinaes. Sunt accentores vitare salvus flavum parses. Ut eleifend mauris et risus ultrices egestas. Potus sensim ad ferox abnoba.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(110,22,3,'Bassus fatalis classiss virtualiter transferre de flavum. Aliquam sodales odio id eleifend tristique. Pellentesque et sapien pulvinar consectetur. Nunc viverra elit ac laoreet suscipit. Sunt torquises imitari velox mirabilis medicinaes. Teres talis saepe tractare de camerarius flavum sensorem. Vae humani generis. Eposs sunt solems de superbus fortis. Morbi tempus commodo mattis.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(111,23,3,'Teres talis saepe tractare de camerarius flavum sensorem. In hac habitasse platea dictumst. Era brevis ratione est. Eros diam egestas libero eu vulputate risus. Sed varius a risus eget aliquam. Nunc viverra elit ac laoreet suscipit. Abnobas sunt hilotaes de placidus vita.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(112,23,3,'Lorem ipsum dolor sit amet consectetur adipiscing elit. Potus sensim ad ferox abnoba. Curabitur aliquam euismod dolor non ornare. Sunt torquises imitari velox mirabilis medicinaes. Urna nisl sollicitudin id varius orci quam id turpis. In hac habitasse platea dictumst.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(113,23,3,'Nulla porta lobortis ligula vel egestas. Diatrias tolerare tanquam noster caesium. Sunt torquises imitari velox mirabilis medicinaes. Ubi est audax amicitia. Potus sensim ad ferox abnoba. Pellentesque vitae velit ex. Eros diam egestas libero eu vulputate risus. Ut suscipit posuere justo at vulputate. Teres talis saepe tractare de camerarius flavum sensorem. Mauris dapibus risus quis suscipit vulputate. Mineralis persuadere omnes finises desiderium. In hac habitasse platea dictumst.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(114,23,3,'Ut eleifend mauris et risus ultrices egestas. Pellentesque vitae velit ex. Bassus fatalis classiss virtualiter transferre de flavum. Curabitur aliquam euismod dolor non ornare. In hac habitasse platea dictumst. Lorem ipsum dolor sit amet consectetur adipiscing elit. Pellentesque et sapien pulvinar consectetur. Eposs sunt solems de superbus fortis. Ubi est audax amicitia. Sunt accentores vitare salvus flavum parses.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(115,23,3,'Silva de secundus galatae demitto quadra. Vae humani generis. Ubi est barbatus nix. Ubi est audax amicitia. Mauris dapibus risus quis suscipit vulputate. Urna nisl sollicitudin id varius orci quam id turpis. Pellentesque et sapien pulvinar consectetur. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(116,24,3,'Eposs sunt solems de superbus fortis. Sed varius a risus eget aliquam. Ut suscipit posuere justo at vulputate. Pellentesque vitae velit ex. Sunt seculaes transferre talis camerarius fluctuies. Curabitur aliquam euismod dolor non ornare. Ut eleifend mauris et risus ultrices egestas. Morbi tempus commodo mattis. Sunt accentores vitare salvus flavum parses. Bassus fatalis classiss virtualiter transferre de flavum. Ubi est barbatus nix.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(117,24,3,'Aliquam sodales odio id eleifend tristique. Sunt torquises imitari velox mirabilis medicinaes. Urna nisl sollicitudin id varius orci quam id turpis. Era brevis ratione est. Potus sensim ad ferox abnoba. Bassus fatalis classiss virtualiter transferre de flavum. Mineralis persuadere omnes finises desiderium. Curabitur aliquam euismod dolor non ornare. Diatrias tolerare tanquam noster caesium.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(118,24,3,'Eros diam egestas libero eu vulputate risus. Morbi tempus commodo mattis. In hac habitasse platea dictumst. Sunt torquises imitari velox mirabilis medicinaes. Ut eleifend mauris et risus ultrices egestas. Pellentesque vitae velit ex. Teres talis saepe tractare de camerarius flavum sensorem. Lorem ipsum dolor sit amet consectetur adipiscing elit. Ubi est barbatus nix.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(119,24,3,'Urna nisl sollicitudin id varius orci quam id turpis. Curabitur aliquam euismod dolor non ornare. Ubi est barbatus nix. Pellentesque vitae velit ex. Abnobas sunt hilotaes de placidus vita. Sunt torquises imitari velox mirabilis medicinaes. Eposs sunt solems de superbus fortis. Ubi est audax amicitia. Morbi tempus commodo mattis.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(120,24,3,'Vae humani generis. Eros diam egestas libero eu vulputate risus. Pellentesque vitae velit ex. Curabitur aliquam euismod dolor non ornare. Sunt seculaes transferre talis camerarius fluctuies. Mauris dapibus risus quis suscipit vulputate. Mineralis persuadere omnes finises desiderium.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(121,25,3,'Eposs sunt solems de superbus fortis. In hac habitasse platea dictumst. Ubi est audax amicitia. Mineralis persuadere omnes finises desiderium. Pellentesque vitae velit ex. Aliquam sodales odio id eleifend tristique. Eros diam egestas libero eu vulputate risus. Sunt seculaes transferre talis camerarius fluctuies. Ut eleifend mauris et risus ultrices egestas. Diatrias tolerare tanquam noster caesium. Era brevis ratione est.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(122,25,3,'Abnobas sunt hilotaes de placidus vita. Diatrias tolerare tanquam noster caesium. Ubi est audax amicitia. Vae humani generis. Ubi est barbatus nix. Mauris dapibus risus quis suscipit vulputate. Urna nisl sollicitudin id varius orci quam id turpis. Potus sensim ad ferox abnoba. Nulla porta lobortis ligula vel egestas. Curabitur aliquam euismod dolor non ornare. Pellentesque et sapien pulvinar consectetur. Silva de secundus galatae demitto quadra. Sunt accentores vitare salvus flavum parses.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(123,25,3,'Morbi tempus commodo mattis. Vae humani generis. Nunc viverra elit ac laoreet suscipit. Abnobas sunt hilotaes de placidus vita. Teres talis saepe tractare de camerarius flavum sensorem. Silva de secundus galatae demitto quadra. Era brevis ratione est. Sunt torquises imitari velox mirabilis medicinaes. Urna nisl sollicitudin id varius orci quam id turpis. Mauris dapibus risus quis suscipit vulputate.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(124,25,3,'Ubi est barbatus nix. In hac habitasse platea dictumst. Nunc viverra elit ac laoreet suscipit. Curabitur aliquam euismod dolor non ornare. Abnobas sunt hilotaes de placidus vita. Ut suscipit posuere justo at vulputate. Era brevis ratione est. Pellentesque et sapien pulvinar consectetur. Diatrias tolerare tanquam noster caesium.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(125,25,3,'Bassus fatalis classiss virtualiter transferre de flavum. Abnobas sunt hilotaes de placidus vita. Mauris dapibus risus quis suscipit vulputate. Ut eleifend mauris et risus ultrices egestas. Nulla porta lobortis ligula vel egestas. Silva de secundus galatae demitto quadra. Eros diam egestas libero eu vulputate risus. Diatrias tolerare tanquam noster caesium. Sunt accentores vitare salvus flavum parses. Teres talis saepe tractare de camerarius flavum sensorem.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(126,26,3,'Sunt seculaes transferre talis camerarius fluctuies. Sunt accentores vitare salvus flavum parses. Ubi est barbatus nix. Mauris dapibus risus quis suscipit vulputate. Urna nisl sollicitudin id varius orci quam id turpis. Ubi est audax amicitia. Sunt torquises imitari velox mirabilis medicinaes. Mineralis persuadere omnes finises desiderium. Morbi tempus commodo mattis. Curabitur aliquam euismod dolor non ornare. Sed varius a risus eget aliquam. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(127,26,3,'Ubi est audax amicitia. Ut suscipit posuere justo at vulputate. Vae humani generis. Ut eleifend mauris et risus ultrices egestas. Sunt seculaes transferre talis camerarius fluctuies. Sed varius a risus eget aliquam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Eros diam egestas libero eu vulputate risus. In hac habitasse platea dictumst. Sunt accentores vitare salvus flavum parses. Mineralis persuadere omnes finises desiderium.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(128,26,3,'Aliquam sodales odio id eleifend tristique. Ut eleifend mauris et risus ultrices egestas. Sunt seculaes transferre talis camerarius fluctuies. Ut suscipit posuere justo at vulputate. Sunt accentores vitare salvus flavum parses. Lorem ipsum dolor sit amet consectetur adipiscing elit. In hac habitasse platea dictumst. Diatrias tolerare tanquam noster caesium. Pellentesque et sapien pulvinar consectetur.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(129,26,3,'Ubi est barbatus nix. Bassus fatalis classiss virtualiter transferre de flavum. Morbi tempus commodo mattis. Mauris dapibus risus quis suscipit vulputate. Pellentesque et sapien pulvinar consectetur. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(130,26,3,'In hac habitasse platea dictumst. Sed varius a risus eget aliquam. Mauris dapibus risus quis suscipit vulputate. Ut suscipit posuere justo at vulputate. Morbi tempus commodo mattis. Vae humani generis. Sunt torquises imitari velox mirabilis medicinaes. Teres talis saepe tractare de camerarius flavum sensorem. Mineralis persuadere omnes finises desiderium.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(131,27,3,'Mauris dapibus risus quis suscipit vulputate. Eros diam egestas libero eu vulputate risus. Ut suscipit posuere justo at vulputate. Potus sensim ad ferox abnoba. Vae humani generis. Ubi est audax amicitia. In hac habitasse platea dictumst. Pellentesque vitae velit ex. Abnobas sunt hilotaes de placidus vita.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(132,27,3,'Pellentesque et sapien pulvinar consectetur. Sunt accentores vitare salvus flavum parses. Aliquam sodales odio id eleifend tristique. Era brevis ratione est. Vae humani generis. Ut suscipit posuere justo at vulputate. Sunt seculaes transferre talis camerarius fluctuies. Mineralis persuadere omnes finises desiderium. Urna nisl sollicitudin id varius orci quam id turpis. Ubi est audax amicitia. Mauris dapibus risus quis suscipit vulputate.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(133,27,3,'Sunt accentores vitare salvus flavum parses. Curabitur aliquam euismod dolor non ornare. Eros diam egestas libero eu vulputate risus. Vae humani generis. Potus sensim ad ferox abnoba. Diatrias tolerare tanquam noster caesium. In hac habitasse platea dictumst. Lorem ipsum dolor sit amet consectetur adipiscing elit. Era brevis ratione est.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(134,27,3,'Sunt torquises imitari velox mirabilis medicinaes. Era brevis ratione est. Teres talis saepe tractare de camerarius flavum sensorem. Eposs sunt solems de superbus fortis. Pellentesque et sapien pulvinar consectetur. Abnobas sunt hilotaes de placidus vita. Morbi tempus commodo mattis. Bassus fatalis classiss virtualiter transferre de flavum. Ubi est audax amicitia.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(135,27,3,'In hac habitasse platea dictumst. Ubi est audax amicitia. Mineralis persuadere omnes finises desiderium. Mauris dapibus risus quis suscipit vulputate. Era brevis ratione est. Pellentesque et sapien pulvinar consectetur. Sunt seculaes transferre talis camerarius fluctuies. Urna nisl sollicitudin id varius orci quam id turpis. Aliquam sodales odio id eleifend tristique. Curabitur aliquam euismod dolor non ornare. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(136,28,3,'Pellentesque vitae velit ex. Ut suscipit posuere justo at vulputate. Silva de secundus galatae demitto quadra. Mineralis persuadere omnes finises desiderium. Nunc viverra elit ac laoreet suscipit. Eros diam egestas libero eu vulputate risus. Sed varius a risus eget aliquam.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(137,28,3,'Eros diam egestas libero eu vulputate risus. Ubi est audax amicitia. In hac habitasse platea dictumst. Mineralis persuadere omnes finises desiderium. Eposs sunt solems de superbus fortis. Bassus fatalis classiss virtualiter transferre de flavum. Vae humani generis.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(138,28,3,'Pellentesque et sapien pulvinar consectetur. Eros diam egestas libero eu vulputate risus. Nunc viverra elit ac laoreet suscipit. Eposs sunt solems de superbus fortis. Teres talis saepe tractare de camerarius flavum sensorem. Sunt seculaes transferre talis camerarius fluctuies.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(139,28,3,'Pellentesque vitae velit ex. Nulla porta lobortis ligula vel egestas. Mauris dapibus risus quis suscipit vulputate. Teres talis saepe tractare de camerarius flavum sensorem. Nunc viverra elit ac laoreet suscipit. Sunt accentores vitare salvus flavum parses. Eros diam egestas libero eu vulputate risus. Lorem ipsum dolor sit amet consectetur adipiscing elit.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(140,28,3,'Pellentesque vitae velit ex. Eros diam egestas libero eu vulputate risus. Morbi tempus commodo mattis. Bassus fatalis classiss virtualiter transferre de flavum. Sunt seculaes transferre talis camerarius fluctuies. Nulla porta lobortis ligula vel egestas. Lorem ipsum dolor sit amet consectetur adipiscing elit. Sunt torquises imitari velox mirabilis medicinaes.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(141,29,3,'Pellentesque vitae velit ex. Ubi est barbatus nix. Eposs sunt solems de superbus fortis. Silva de secundus galatae demitto quadra. Vae humani generis. Diatrias tolerare tanquam noster caesium. Ut eleifend mauris et risus ultrices egestas. Pellentesque et sapien pulvinar consectetur. Sunt torquises imitari velox mirabilis medicinaes. Ubi est audax amicitia. Abnobas sunt hilotaes de placidus vita. Mineralis persuadere omnes finises desiderium. Mauris dapibus risus quis suscipit vulputate.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(142,29,3,'Mauris dapibus risus quis suscipit vulputate. In hac habitasse platea dictumst. Urna nisl sollicitudin id varius orci quam id turpis. Sed varius a risus eget aliquam. Curabitur aliquam euismod dolor non ornare. Ubi est audax amicitia. Ubi est barbatus nix. Aliquam sodales odio id eleifend tristique. Pellentesque et sapien pulvinar consectetur. Abnobas sunt hilotaes de placidus vita. Ut suscipit posuere justo at vulputate.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(143,29,3,'Mineralis persuadere omnes finises desiderium. Curabitur aliquam euismod dolor non ornare. Sunt accentores vitare salvus flavum parses. In hac habitasse platea dictumst. Ut eleifend mauris et risus ultrices egestas. Nulla porta lobortis ligula vel egestas.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(144,29,3,'Potus sensim ad ferox abnoba. Abnobas sunt hilotaes de placidus vita. Era brevis ratione est. Vae humani generis. Mauris dapibus risus quis suscipit vulputate. Ubi est audax amicitia. Nulla porta lobortis ligula vel egestas. Teres talis saepe tractare de camerarius flavum sensorem. Eros diam egestas libero eu vulputate risus. Urna nisl sollicitudin id varius orci quam id turpis. In hac habitasse platea dictumst.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(145,29,3,'Ubi est barbatus nix. In hac habitasse platea dictumst. Diatrias tolerare tanquam noster caesium. Nulla porta lobortis ligula vel egestas. Sunt torquises imitari velox mirabilis medicinaes. Sed varius a risus eget aliquam. Pellentesque et sapien pulvinar consectetur. Morbi tempus commodo mattis. Eros diam egestas libero eu vulputate risus. Mauris dapibus risus quis suscipit vulputate. Nunc viverra elit ac laoreet suscipit.','2017-12-05 17:36:48');
|
||||
INSERT INTO symfony_demo_comment VALUES(146,30,3,'Curabitur aliquam euismod dolor non ornare. Potus sensim ad ferox abnoba. Sunt accentores vitare salvus flavum parses. Ubi est audax amicitia. Ubi est barbatus nix. Bassus fatalis classiss virtualiter transferre de flavum. Ut suscipit posuere justo at vulputate. In hac habitasse platea dictumst. Diatrias tolerare tanquam noster caesium.','2017-12-05 17:36:44');
|
||||
INSERT INTO symfony_demo_comment VALUES(147,30,3,'Lorem ipsum dolor sit amet consectetur adipiscing elit. Bassus fatalis classiss virtualiter transferre de flavum. Pellentesque vitae velit ex. Eposs sunt solems de superbus fortis. Urna nisl sollicitudin id varius orci quam id turpis. Sunt seculaes transferre talis camerarius fluctuies. Sed varius a risus eget aliquam.','2017-12-05 17:36:45');
|
||||
INSERT INTO symfony_demo_comment VALUES(148,30,3,'Lorem ipsum dolor sit amet consectetur adipiscing elit. Abnobas sunt hilotaes de placidus vita. Mineralis persuadere omnes finises desiderium. In hac habitasse platea dictumst. Ut eleifend mauris et risus ultrices egestas. Nulla porta lobortis ligula vel egestas. Aliquam sodales odio id eleifend tristique. Bassus fatalis classiss virtualiter transferre de flavum. Sunt accentores vitare salvus flavum parses.','2017-12-05 17:36:46');
|
||||
INSERT INTO symfony_demo_comment VALUES(149,30,3,'Nulla porta lobortis ligula vel egestas. Teres talis saepe tractare de camerarius flavum sensorem. Sunt accentores vitare salvus flavum parses. Ut suscipit posuere justo at vulputate. Eposs sunt solems de superbus fortis. Curabitur aliquam euismod dolor non ornare. Bassus fatalis classiss virtualiter transferre de flavum. Silva de secundus galatae demitto quadra. Sunt torquises imitari velox mirabilis medicinaes. Nunc viverra elit ac laoreet suscipit. Sed varius a risus eget aliquam.','2017-12-05 17:36:47');
|
||||
INSERT INTO symfony_demo_comment VALUES(150,30,3,'Ubi est barbatus nix. Ubi est audax amicitia. Abnobas sunt hilotaes de placidus vita. Bassus fatalis classiss virtualiter transferre de flavum. Sunt seculaes transferre talis camerarius fluctuies. Urna nisl sollicitudin id varius orci quam id turpis. Sunt torquises imitari velox mirabilis medicinaes.','2017-12-05 17:36:48');
|
||||
CREATE TABLE symfony_demo_post (id INTEGER NOT NULL PRIMARY KEY, author_id INTEGER NOT NULL, title VARCHAR(255) NOT NULL, slug VARCHAR(255) NOT NULL, summary VARCHAR(255) NOT NULL, content TEXT NOT NULL, published_at DATETIME NOT NULL);
|
||||
INSERT INTO symfony_demo_post VALUES(1,1,'Lorem ipsum dolor sit amet consectetur adipiscing elit','lorem-ipsum-dolor-sit-amet-consectetur-adipiscing-elit','Ut suscipit posuere justo at vulputate. Aliquam sodales odio id eleifend tristique. Potus sensim ad ferox abnoba. Teres talis saepe tractare de camerarius flavum sensorem. Silva de secundus galatae demitto quadra.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-12-05 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(2,1,'Pellentesque vitae velit ex','pellentesque-vitae-velit-ex','Ubi est barbatus nix. Lorem ipsum dolor sit amet consectetur adipiscing elit. Urna nisl sollicitudin id varius orci quam id turpis. Curabitur aliquam euismod dolor non ornare. Bassus fatalis classiss virtualiter transferre de flavum.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-12-04 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(3,2,'Mauris dapibus risus quis suscipit vulputate','mauris-dapibus-risus-quis-suscipit-vulputate','Morbi tempus commodo mattis. Ut suscipit posuere justo at vulputate. Ubi est barbatus nix. Eposs sunt solems de superbus fortis. Eros diam egestas libero eu vulputate risus. Sunt torquises imitari velox mirabilis medicinaes.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-12-03 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(4,1,'Eros diam egestas libero eu vulputate risus','eros-diam-egestas-libero-eu-vulputate-risus','Pellentesque vitae velit ex. Teres talis saepe tractare de camerarius flavum sensorem. Nulla porta lobortis ligula vel egestas. Pellentesque et sapien pulvinar consectetur. Aliquam sodales odio id eleifend tristique.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-12-02 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(5,1,'In hac habitasse platea dictumst','in-hac-habitasse-platea-dictumst','Urna nisl sollicitudin id varius orci quam id turpis. Potus sensim ad ferox abnoba. Mineralis persuadere omnes finises desiderium. Silva de secundus galatae demitto quadra. Curabitur aliquam euismod dolor non ornare. Pellentesque vitae velit ex.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-12-01 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(6,2,'Morbi tempus commodo mattis','morbi-tempus-commodo-mattis','Nunc viverra elit ac laoreet suscipit. Ubi est audax amicitia. Vae humani generis. Lorem ipsum dolor sit amet consectetur adipiscing elit. Bassus fatalis classiss virtualiter transferre de flavum. Pellentesque vitae velit ex.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-30 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(7,2,'Ut suscipit posuere justo at vulputate','ut-suscipit-posuere-justo-at-vulputate','Morbi tempus commodo mattis. Abnobas sunt hilotaes de placidus vita. Pellentesque et sapien pulvinar consectetur. Ubi est audax amicitia. Urna nisl sollicitudin id varius orci quam id turpis. Potus sensim ad ferox abnoba.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-29 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(8,2,'Ut eleifend mauris et risus ultrices egestas','ut-eleifend-mauris-et-risus-ultrices-egestas','Eposs sunt solems de superbus fortis. Mineralis persuadere omnes finises desiderium. Sed varius a risus eget aliquam. In hac habitasse platea dictumst. Sunt torquises imitari velox mirabilis medicinaes. Eros diam egestas libero eu vulputate risus.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-28 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(9,2,'Aliquam sodales odio id eleifend tristique','aliquam-sodales-odio-id-eleifend-tristique','Potus sensim ad ferox abnoba. Sunt accentores vitare salvus flavum parses. Nulla porta lobortis ligula vel egestas. Mineralis persuadere omnes finises desiderium. Sunt torquises imitari velox mirabilis medicinaes.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-27 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(10,2,'Urna nisl sollicitudin id varius orci quam id turpis','urna-nisl-sollicitudin-id-varius-orci-quam-id-turpis','Mineralis persuadere omnes finises desiderium. Pellentesque vitae velit ex. Urna nisl sollicitudin id varius orci quam id turpis. Bassus fatalis classiss virtualiter transferre de flavum. Eros diam egestas libero eu vulputate risus.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-26 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(11,1,'Nulla porta lobortis ligula vel egestas','nulla-porta-lobortis-ligula-vel-egestas','Potus sensim ad ferox abnoba. Mauris dapibus risus quis suscipit vulputate. Sunt accentores vitare salvus flavum parses. Teres talis saepe tractare de camerarius flavum sensorem. Sed varius a risus eget aliquam.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-25 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(12,1,'Curabitur aliquam euismod dolor non ornare','curabitur-aliquam-euismod-dolor-non-ornare','Potus sensim ad ferox abnoba. Pellentesque vitae velit ex. Nulla porta lobortis ligula vel egestas. Ubi est barbatus nix. Eros diam egestas libero eu vulputate risus. Nunc viverra elit ac laoreet suscipit. Sunt accentores vitare salvus flavum parses.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-24 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(13,2,'Sed varius a risus eget aliquam','sed-varius-a-risus-eget-aliquam','Ut suscipit posuere justo at vulputate. Pellentesque et sapien pulvinar consectetur. Curabitur aliquam euismod dolor non ornare. Ut eleifend mauris et risus ultrices egestas. Sunt torquises imitari velox mirabilis medicinaes.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-23 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(14,2,'Nunc viverra elit ac laoreet suscipit','nunc-viverra-elit-ac-laoreet-suscipit','Sed varius a risus eget aliquam. Potus sensim ad ferox abnoba. Diatrias tolerare tanquam noster caesium. Eposs sunt solems de superbus fortis. Urna nisl sollicitudin id varius orci quam id turpis. Ubi est barbatus nix.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-22 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(15,1,'Pellentesque et sapien pulvinar consectetur','pellentesque-et-sapien-pulvinar-consectetur','Sunt seculaes transferre talis camerarius fluctuies. Sed varius a risus eget aliquam. Eros diam egestas libero eu vulputate risus. Urna nisl sollicitudin id varius orci quam id turpis. Ubi est audax amicitia. In hac habitasse platea dictumst.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-21 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(16,2,'Ubi est barbatus nix','ubi-est-barbatus-nix','Mauris dapibus risus quis suscipit vulputate. Sunt accentores vitare salvus flavum parses. Bassus fatalis classiss virtualiter transferre de flavum. Teres talis saepe tractare de camerarius flavum sensorem. Nunc viverra elit ac laoreet suscipit.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-20 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(17,2,'Abnobas sunt hilotaes de placidus vita','abnobas-sunt-hilotaes-de-placidus-vita','Pellentesque vitae velit ex. Morbi tempus commodo mattis. Vae humani generis. Nunc viverra elit ac laoreet suscipit. Urna nisl sollicitudin id varius orci quam id turpis. Potus sensim ad ferox abnoba. Mauris dapibus risus quis suscipit vulputate.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-19 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(18,1,'Ubi est audax amicitia','ubi-est-audax-amicitia','Bassus fatalis classiss virtualiter transferre de flavum. Diatrias tolerare tanquam noster caesium. Urna nisl sollicitudin id varius orci quam id turpis. Sed varius a risus eget aliquam. Ubi est barbatus nix. Pellentesque vitae velit ex.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-18 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(19,1,'Eposs sunt solems de superbus fortis','eposs-sunt-solems-de-superbus-fortis','Pellentesque vitae velit ex. Diatrias tolerare tanquam noster caesium. Lorem ipsum dolor sit amet consectetur adipiscing elit. Morbi tempus commodo mattis. Urna nisl sollicitudin id varius orci quam id turpis.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-17 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(20,1,'Vae humani generis','vae-humani-generis','Teres talis saepe tractare de camerarius flavum sensorem. Mauris dapibus risus quis suscipit vulputate. Ut eleifend mauris et risus ultrices egestas. Pellentesque et sapien pulvinar consectetur. Nulla porta lobortis ligula vel egestas.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-16 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(21,1,'Diatrias tolerare tanquam noster caesium','diatrias-tolerare-tanquam-noster-caesium','Aliquam sodales odio id eleifend tristique. Sed varius a risus eget aliquam. Ubi est audax amicitia. Pellentesque vitae velit ex. Vae humani generis. Ut suscipit posuere justo at vulputate. Urna nisl sollicitudin id varius orci quam id turpis.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-15 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(22,1,'Teres talis saepe tractare de camerarius flavum sensorem','teres-talis-saepe-tractare-de-camerarius-flavum-sensorem','Era brevis ratione est. Diatrias tolerare tanquam noster caesium. Eposs sunt solems de superbus fortis. Mineralis persuadere omnes finises desiderium. In hac habitasse platea dictumst. Bassus fatalis classiss virtualiter transferre de flavum.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-14 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(23,2,'Silva de secundus galatae demitto quadra','silva-de-secundus-galatae-demitto-quadra','Nunc viverra elit ac laoreet suscipit. Pellentesque et sapien pulvinar consectetur. Lorem ipsum dolor sit amet consectetur adipiscing elit. Potus sensim ad ferox abnoba. Sunt torquises imitari velox mirabilis medicinaes.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-13 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(24,1,'Sunt accentores vitare salvus flavum parses','sunt-accentores-vitare-salvus-flavum-parses','Teres talis saepe tractare de camerarius flavum sensorem. Ubi est audax amicitia. Eposs sunt solems de superbus fortis. Sunt accentores vitare salvus flavum parses. Morbi tempus commodo mattis. Aliquam sodales odio id eleifend tristique.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-12 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(25,1,'Potus sensim ad ferox abnoba','potus-sensim-ad-ferox-abnoba','Silva de secundus galatae demitto quadra. Pellentesque et sapien pulvinar consectetur. Potus sensim ad ferox abnoba. Vae humani generis. Pellentesque vitae velit ex. Mauris dapibus risus quis suscipit vulputate. Aliquam sodales odio id eleifend tristique.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-11 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(26,1,'Sunt seculaes transferre talis camerarius fluctuies','sunt-seculaes-transferre-talis-camerarius-fluctuies','Ut eleifend mauris et risus ultrices egestas. In hac habitasse platea dictumst. Lorem ipsum dolor sit amet consectetur adipiscing elit. Bassus fatalis classiss virtualiter transferre de flavum. Sed varius a risus eget aliquam.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-10 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(27,2,'Era brevis ratione est','era-brevis-ratione-est','Diatrias tolerare tanquam noster caesium. Nunc viverra elit ac laoreet suscipit. Pellentesque vitae velit ex. Potus sensim ad ferox abnoba. Eros diam egestas libero eu vulputate risus. Ut eleifend mauris et risus ultrices egestas.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-09 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(28,1,'Sunt torquises imitari velox mirabilis medicinaes','sunt-torquises-imitari-velox-mirabilis-medicinaes','Eros diam egestas libero eu vulputate risus. Teres talis saepe tractare de camerarius flavum sensorem. Nulla porta lobortis ligula vel egestas. Morbi tempus commodo mattis. Ubi est barbatus nix. Bassus fatalis classiss virtualiter transferre de flavum.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-08 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(29,1,'Mineralis persuadere omnes finises desiderium','mineralis-persuadere-omnes-finises-desiderium','Lorem ipsum dolor sit amet consectetur adipiscing elit. Diatrias tolerare tanquam noster caesium. Ut suscipit posuere justo at vulputate. Eros diam egestas libero eu vulputate risus. Sunt accentores vitare salvus flavum parses. Ubi est barbatus nix.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-07 17:36:43');
|
||||
INSERT INTO symfony_demo_post VALUES(30,2,'Bassus fatalis classiss virtualiter transferre de flavum','bassus-fatalis-classiss-virtualiter-transferre-de-flavum','Sed varius a risus eget aliquam. Silva de secundus galatae demitto quadra. Pellentesque vitae velit ex. Mauris dapibus risus quis suscipit vulputate. Pellentesque et sapien pulvinar consectetur. Eros diam egestas libero eu vulputate risus.',replace('Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor\nincididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in\nreprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia\ndeserunt mollit anim id est laborum.\n\n * Ut enim ad minim veniam\n * Quis nostrud exercitation *ullamco laboris*\n * Nisi ut aliquip ex ea commodo consequat\n\nPraesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at\nnunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.\nClass aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos\nhimenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a\nluctus dolor.\n\nInteger auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*\nex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.\nPraesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque\nefficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue\nnulla vitae est.\n\nUt posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**\nsociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi\narcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel\nipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed\ntincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.\nSed in egestas erat.\n\nAliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum\nlacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec\ncongue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam\ntempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus\ntincidunt, faucibus nisl in, aliquet libero.','\n',char(10)),'2017-11-06 17:36:43');
|
||||
CREATE TABLE symfony_demo_post_tag (post_id INTEGER NOT NULL, tag_id INTEGER NOT NULL);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(1,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(1,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(1,6);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(1,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(2,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(2,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(2,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(2,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(3,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(3,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(3,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(4,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(4,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(5,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(5,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(5,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(6,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(6,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(7,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(7,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(7,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(8,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(8,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(9,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(9,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(9,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(9,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(10,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(10,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(10,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(11,6);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(11,2);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(11,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(12,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(12,2);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(12,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(12,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(13,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(13,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(14,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(14,6);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(15,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(15,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(15,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(16,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(16,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(16,6);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(17,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(17,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(18,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(18,2);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(18,6);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(18,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(19,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(19,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(19,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(19,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(20,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(20,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(20,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(20,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(21,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(21,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(21,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(22,6);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(22,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(22,2);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(23,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(23,4);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(23,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(23,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(24,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(24,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(25,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(25,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(25,6);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(26,7);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(26,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(26,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(27,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(27,9);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(28,3);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(28,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(29,8);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(29,5);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(30,2);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(30,1);
|
||||
INSERT INTO symfony_demo_post_tag VALUES(30,6);
|
||||
CREATE TABLE symfony_demo_tag (id INTEGER NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id));
|
||||
INSERT INTO symfony_demo_tag VALUES(1,'lorem');
|
||||
INSERT INTO symfony_demo_tag VALUES(2,'ipsum');
|
||||
INSERT INTO symfony_demo_tag VALUES(3,'consectetur');
|
||||
INSERT INTO symfony_demo_tag VALUES(4,'adipiscing');
|
||||
INSERT INTO symfony_demo_tag VALUES(5,'incididunt');
|
||||
INSERT INTO symfony_demo_tag VALUES(6,'labore');
|
||||
INSERT INTO symfony_demo_tag VALUES(7,'voluptate');
|
||||
INSERT INTO symfony_demo_tag VALUES(8,'dolore');
|
||||
INSERT INTO symfony_demo_tag VALUES(9,'pariatur');
|
||||
CREATE TABLE symfony_demo_user (id INTEGER NOT NULL, full_name VARCHAR(255) NOT NULL, username VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, roles TEXT NOT NULL, PRIMARY KEY(id));
|
||||
INSERT INTO symfony_demo_user VALUES(1,'Jane Doe','jane_admin','jane_admin@symfony.com','$2y$13$IMalnQpo7xfZD5FJGbEadOcqyj2mi/NQbQiI8v2wBXfjZ4nwshJlG','["ROLE_ADMIN"]');
|
||||
INSERT INTO symfony_demo_user VALUES(2,'Tom Doe','tom_admin','tom_admin@symfony.com','$2y$13$m45IusIVHTcBoBQTBd/V.O5EuwOSIYNiuWnw0gsgo7XJDQwDJ83aC','["ROLE_ADMIN"]');
|
||||
INSERT INTO symfony_demo_user VALUES(3,'John Doe','john_user','john_user@symfony.com','$2y$13$236BEGW9Gnbmv.lfrkZLwujj0jSOYFsQ5dI90BqM9s2mZ9WbzJmzO','["ROLE_USER"]');
|
||||
CREATE INDEX IDX_53AD8F834B89032C ON symfony_demo_comment (post_id);
|
||||
CREATE INDEX IDX_53AD8F83F675F31B ON symfony_demo_comment (author_id);
|
||||
CREATE INDEX IDX_58A92E65F675F31B ON symfony_demo_post (author_id);
|
||||
CREATE INDEX IDX_6ABC1CC44B89032C ON symfony_demo_post_tag (post_id);
|
||||
CREATE INDEX IDX_6ABC1CC4BAD26311 ON symfony_demo_post_tag (tag_id);
|
||||
CREATE UNIQUE INDEX UNIQ_4D5855405E237E06 ON symfony_demo_tag (name);
|
||||
CREATE UNIQUE INDEX UNIQ_8FB094A1F85E0677 ON symfony_demo_user (username);
|
||||
CREATE UNIQUE INDEX UNIQ_8FB094A1E7927C74 ON symfony_demo_user (email);
|
||||
32
pgo/cases/symfony_demo_pdo_mysql/doctrine.yaml
Normal file
32
pgo/cases/symfony_demo_pdo_mysql/doctrine.yaml
Normal file
@@ -0,0 +1,32 @@
|
||||
parameters:
|
||||
# Adds a fallback DATABASE_URL if the env var is not set. This allows you
|
||||
# to run cache:warmup even if your environment variables are not available
|
||||
# yet. You should not need to change this value.
|
||||
env(DATABASE_URL): ''
|
||||
database_host: '127.0.0.1'
|
||||
database_port: 3307
|
||||
database_name: 'symfony_demo_pdo_mysql'
|
||||
database_user: 'root'
|
||||
database_password: ''
|
||||
|
||||
doctrine:
|
||||
dbal:
|
||||
driver: pdo_mysql
|
||||
host: "%database_host%"
|
||||
port: "%database_port%"
|
||||
dbname: "%database_name%"
|
||||
user: "%database_user%"
|
||||
password: "%database_password%"
|
||||
charset: UTF8
|
||||
url: '%env(resolve:DATABASE_URL)%'
|
||||
orm:
|
||||
auto_generate_proxy_classes: '%kernel.debug%'
|
||||
naming_strategy: doctrine.orm.naming_strategy.underscore
|
||||
auto_mapping: true
|
||||
mappings:
|
||||
App:
|
||||
is_bundle: false
|
||||
type: annotation
|
||||
dir: '%kernel.project_dir%/src/Entity'
|
||||
prefix: 'App\Entity'
|
||||
alias: App
|
||||
24
pgo/cases/symfony_demo_pdo_mysql/env.tpl
Normal file
24
pgo/cases/symfony_demo_pdo_mysql/env.tpl
Normal file
@@ -0,0 +1,24 @@
|
||||
# This file is a "template" of which env vars needs to be defined in your configuration or in an .env file
|
||||
# Set variables here that may be different on each deployment target of the app, e.g. development, staging, production.
|
||||
# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
|
||||
|
||||
###> symfony/framework-bundle ###
|
||||
APP_ENV=prod
|
||||
APP_DEBUG=1
|
||||
APP_SECRET=67d829bf61dc5f87a73fd814e2c9f629
|
||||
###< symfony/framework-bundle ###
|
||||
|
||||
###> doctrine/doctrine-bundle ###
|
||||
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
|
||||
# For a sqlite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
|
||||
# Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls
|
||||
#DATABASE_URL=sqlite:///%kernel.project_dir%/var/data/blog.sqlite
|
||||
DATABASE_URL=pdo-mysql://%database_host%:%database_port%/%database_name%
|
||||
###< doctrine/doctrine-bundle ###
|
||||
|
||||
###> symfony/swiftmailer-bundle ###
|
||||
# For Gmail as a transport, use: "gmail://username:password@localhost"
|
||||
# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode="
|
||||
# Delivery is disabled by default via "null://localhost"
|
||||
MAILER_URL=null://localhost
|
||||
###< symfony/swiftmailer-bundle ###
|
||||
26
pgo/cases/symfony_demo_pdo_mysql/nginx.partial.conf
Normal file
26
pgo/cases/symfony_demo_pdo_mysql/nginx.partial.conf
Normal file
@@ -0,0 +1,26 @@
|
||||
server {
|
||||
listen PHP_SDK_PGO_SYMFONY_DEMO_PDO_MYSQL_HTTP_PORT;
|
||||
server_name PHP_SDK_PGO_SYMFONY_DEMO_PDO_MYSQL_HTTP_HOST;
|
||||
|
||||
root PHP_SDK_PGO_SYMFONY_DEMO_PDO_MYSQL_DOCROOT;
|
||||
index index.html index.htm index.php;
|
||||
|
||||
# symfony
|
||||
location / {
|
||||
try_files $uri /index.php$is_args$args;
|
||||
}
|
||||
|
||||
location ~ ^/index\.php(/|$) {
|
||||
fastcgi_pass PHP_SDK_PGO_PHP_FCGI_HOST:PHP_SDK_PGO_PHP_FCGI_PORT;
|
||||
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||
fastcgi_param DOCUMENT_ROOT $realpath_root;
|
||||
#internal;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
6
pgo/cases/symfony_demo_pdo_mysql/phpsdk_pgo.json
Normal file
6
pgo/cases/symfony_demo_pdo_mysql/phpsdk_pgo.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"symfony_demo_version": "v1.2.2",
|
||||
"type": "web",
|
||||
"srv_http": "nginx",
|
||||
"srv_db": "mariadb"
|
||||
}
|
||||
159
pgo/cases/wordpress/TrainingCaseHandler.php
Normal file
159
pgo/cases/wordpress/TrainingCaseHandler.php
Normal file
@@ -0,0 +1,159 @@
|
||||
<?php
|
||||
|
||||
namespace wordpress;
|
||||
|
||||
use SDK\Build\PGO\Abstracts;
|
||||
use SDK\Build\PGO\Interfaces;
|
||||
use SDK\Build\PGO\Config;
|
||||
use SDK\Build\PGO\PHP;
|
||||
use SDK\{Config as SDKConfig, Exception, FileOps};
|
||||
use SDK\Build\PGO\Tool;
|
||||
|
||||
class TrainingCaseHandler extends Abstracts\TrainingCase implements Interfaces\TrainingCase
|
||||
{
|
||||
protected $conf;
|
||||
protected $base;
|
||||
protected $nginx;
|
||||
protected $maria;
|
||||
protected $php;
|
||||
protected $max_runs = 4;
|
||||
|
||||
public function __construct(Config $conf, ?Interfaces\Server $nginx, ?Interfaces\Server\DB $maria)
|
||||
{
|
||||
if (!$nginx) {
|
||||
throw new Exception("Invalid NGINX object");
|
||||
}
|
||||
|
||||
$this->conf = $conf;
|
||||
$this->base = $this->conf->getCaseWorkDir($this->getName());
|
||||
$this->nginx = $nginx;
|
||||
$this->maria = $maria;
|
||||
$this->php = $nginx->getPhp();
|
||||
}
|
||||
|
||||
public function getName() : string
|
||||
{
|
||||
return __NAMESPACE__;
|
||||
}
|
||||
|
||||
public function getJobFilename() : string
|
||||
{
|
||||
return $this->conf->getJobDir() . DIRECTORY_SEPARATOR . $this->getName() . ".txt";
|
||||
}
|
||||
|
||||
protected function getToolFn() : string
|
||||
{
|
||||
return $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "wp-cli.phar";
|
||||
}
|
||||
|
||||
protected function setupDist() : void
|
||||
{
|
||||
$cmd_path_arg = "--path=" . $this->base;
|
||||
|
||||
if (!is_dir($this->base)) {
|
||||
echo "Setting up " . $this->getName() . " in '{$this->base}'\n";
|
||||
/* XXX Use host PHP for this. */
|
||||
$php = new PHP\CLI($this->conf);
|
||||
$php->exec($this->getToolFn() . " core download --force $cmd_path_arg");
|
||||
unset($php);
|
||||
}
|
||||
|
||||
$http_port = $this->getHttpPort();
|
||||
$http_host = $this->getHttpHost();
|
||||
$db_port = $this->getDbPort();
|
||||
$db_host = $this->getDbHost();
|
||||
$db_user = $this->getDbUser();
|
||||
$db_pass = $this->getDbPass();
|
||||
|
||||
$vars = array(
|
||||
$this->conf->buildTplVarName($this->getName(), "docroot") => str_replace("\\", "/", $this->base),
|
||||
);
|
||||
$tpl_fn = $this->conf->getCasesTplDir($this->getName()) . DIRECTORY_SEPARATOR . "nginx.partial.conf";
|
||||
$this->nginx->addServer($tpl_fn, $vars);
|
||||
|
||||
|
||||
$php = new PHP\CLI($this->conf);
|
||||
|
||||
$this->maria->up();
|
||||
$this->nginx->up();
|
||||
|
||||
$this->maria->query("DROP DATABASE IF EXISTS " . $this->getName());
|
||||
$this->maria->query("CREATE DATABASE " . $this->getName());
|
||||
|
||||
$env = array(
|
||||
"PATH" => $this->conf->getSrvDir(strtolower($this->maria->getName())) . DIRECTORY_SEPARATOR . "bin",
|
||||
);
|
||||
|
||||
$cmd = $this->getToolFn() . " core config --force --dbname=" . $this->getName() . " --dbuser=$db_user --dbpass=$db_pass --dbhost=$db_host:$db_port $cmd_path_arg";
|
||||
$php->exec($cmd, NULL, $env);
|
||||
|
||||
$site_adm = trim(shell_exec("pwgen -1 -s 8"));
|
||||
$this->conf->setSectionItem($this->getName(), "site_admin_user", $site_adm);
|
||||
$site_pw = trim(shell_exec("pwgen -1 -s 8"));
|
||||
$this->conf->setSectionItem($this->getName(), "site_admin_pass", $site_pw);
|
||||
//save admin user and pass to config
|
||||
//$cmd = $this->getToolFn() . " core install --url=$http_host:$http_port --title=hello --admin_user=$site_adm_user --admin_password=$site_adm_pw --admin_email=a@bc.de --skip-email --path=" . $this->base;
|
||||
$cmd = $this->getToolFn() . " core install --url=$http_host:$http_port --title=hello --admin_user=$site_adm --admin_password=$site_pw --admin_email=ostc@test.abc --skip-email $cmd_path_arg";
|
||||
$php->exec($cmd, NULL, $env);
|
||||
|
||||
$cmd = $this->getToolFn() . " plugin install wordpress-importer --activate --allow-root $cmd_path_arg";
|
||||
$php->exec($cmd, NULL, $env);
|
||||
|
||||
$cmd = $this->getToolFn() . " import " . $this->conf->getToolSDir() . DIRECTORY_SEPARATOR . "wptest/wptest.xml --authors=create --allow-root $cmd_path_arg";
|
||||
$php->exec($cmd, NULL, $env);
|
||||
|
||||
$this->nginx->down(true);
|
||||
$this->maria->down(true);
|
||||
|
||||
}
|
||||
|
||||
public function setupUrls()
|
||||
{
|
||||
$this->maria->up();
|
||||
$this->nginx->up();
|
||||
|
||||
$url = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort();
|
||||
$s = file_get_contents($url);
|
||||
|
||||
$this->nginx->down(true);
|
||||
$this->maria->down(true);
|
||||
|
||||
echo "Generating training urls.\n";
|
||||
|
||||
$lst = array();
|
||||
if (preg_match_all(", href=\"([^\"]+" . $this->getHttpHost() . ":" . $this->getHttpPort() . "[^\"]+)\",", $s, $m)) {
|
||||
$lst = array_unique($m[1]);
|
||||
}
|
||||
|
||||
if (empty($lst)) {
|
||||
printf("\033[31m WARNING: Training URL list is empty, check the regex and the possible previous error messages!\033[0m\n");
|
||||
}
|
||||
|
||||
$fn = $this->getJobFilename();
|
||||
$s = implode("\n", $lst);
|
||||
if (strlen($s) !== file_put_contents($fn, $s)) {
|
||||
throw new Exception("Couldn't write '$fn'.");
|
||||
}
|
||||
}
|
||||
|
||||
public function prepareInit(Tool\PackageWorkman $pw, bool $force = false) : void
|
||||
{
|
||||
$url = $this->conf->getSectionItem($this->getName(), "wp_cli_phar_url");
|
||||
$pw->fetch($url, $this->getToolFn(), $force);
|
||||
$url = $this->conf->getSectionItem($this->getName(), "wptest_zip_url");
|
||||
$pw->fetchAndUnzip($url, "wptest.zip", $this->conf->getToolSDir(), "wptest", $force);
|
||||
}
|
||||
|
||||
public function init() : void
|
||||
{
|
||||
echo "Initializing " . $this->getName() . ".\n";
|
||||
|
||||
$this->setupDist();
|
||||
$this->setupUrls();
|
||||
|
||||
echo $this->getName() . " initialization done.\n";
|
||||
echo $this->getName() . " site configured to run under " . $this->getHttpHost() . ":" .$this->getHttpPort() . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
14
pgo/cases/wordpress/nginx.partial.conf
Normal file
14
pgo/cases/wordpress/nginx.partial.conf
Normal file
@@ -0,0 +1,14 @@
|
||||
server {
|
||||
listen PHP_SDK_PGO_WORDPRESS_HTTP_PORT;
|
||||
server_name PHP_SDK_PGO_WORDPRESS_HTTP_HOST;
|
||||
|
||||
root PHP_SDK_PGO_WORDPRESS_DOCROOT;
|
||||
index index.html index.htm index.php;
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass PHP_SDK_PGO_PHP_FCGI_HOST:PHP_SDK_PGO_PHP_FCGI_PORT;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
}
|
||||
}
|
||||
7
pgo/cases/wordpress/phpsdk_pgo.json
Normal file
7
pgo/cases/wordpress/phpsdk_pgo.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"wp_cli_phar_url": "https://github.com/wp-cli/wp-cli/releases/download/v1.1.0/wp-cli-1.1.0.phar",
|
||||
"wptest_zip_url": "https://github.com/manovotny/wptest/archive/master.zip",
|
||||
"type": "web",
|
||||
"srv_http": "nginx",
|
||||
"srv_db": "mariadb"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user