119 lines
3.3 KiB
PHP
119 lines
3.3 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Start file for windows
|
||
|
*/
|
||
|
require_once __DIR__ . '/vendor/autoload.php';
|
||
|
|
||
|
use Dotenv\Dotenv;
|
||
|
use process\Monitor;
|
||
|
use support\App;
|
||
|
use Workerman\Worker;
|
||
|
|
||
|
ini_set('display_errors', 'on');
|
||
|
error_reporting(E_ALL);
|
||
|
|
||
|
if (class_exists('Dotenv\Dotenv') && file_exists(base_path() . '/.env')) {
|
||
|
if (method_exists('Dotenv\Dotenv', 'createUnsafeImmutable')) {
|
||
|
Dotenv::createUnsafeImmutable(base_path())->load();
|
||
|
} else {
|
||
|
Dotenv::createMutable(base_path())->load();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
App::loadAllConfig(['route']);
|
||
|
|
||
|
$errorReporting = config('app.error_reporting');
|
||
|
if (isset($errorReporting)) {
|
||
|
error_reporting($errorReporting);
|
||
|
}
|
||
|
|
||
|
$runtimeProcessPath = runtime_path() . DIRECTORY_SEPARATOR . '/windows';
|
||
|
if (!is_dir($runtimeProcessPath)) {
|
||
|
mkdir($runtimeProcessPath);
|
||
|
}
|
||
|
$processFiles = [
|
||
|
__DIR__ . DIRECTORY_SEPARATOR . 'start.php'
|
||
|
];
|
||
|
foreach (config('process', []) as $processName => $config) {
|
||
|
$processFiles[] = write_process_file($runtimeProcessPath, $processName, '');
|
||
|
}
|
||
|
|
||
|
foreach (config('plugin', []) as $firm => $projects) {
|
||
|
foreach ($projects as $name => $project) {
|
||
|
if (!is_array($project)) {
|
||
|
continue;
|
||
|
}
|
||
|
foreach ($project['process'] ?? [] as $processName => $config) {
|
||
|
$processFiles[] = write_process_file($runtimeProcessPath, $processName, "$firm.$name");
|
||
|
}
|
||
|
}
|
||
|
foreach ($projects['process'] ?? [] as $processName => $config) {
|
||
|
$processFiles[] = write_process_file($runtimeProcessPath, $processName, $firm);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function write_process_file($runtimeProcessPath, $processName, $firm): string
|
||
|
{
|
||
|
$processParam = $firm ? "plugin.$firm.$processName" : $processName;
|
||
|
$configParam = $firm ? "config('plugin.$firm.process')['$processName']" : "config('process')['$processName']";
|
||
|
$fileContent = <<<EOF
|
||
|
<?php
|
||
|
require_once __DIR__ . '/../../vendor/autoload.php';
|
||
|
|
||
|
use Workerman\Worker;
|
||
|
use Workerman\Connection\TcpConnection;
|
||
|
use Webman\Config;
|
||
|
use support\App;
|
||
|
|
||
|
ini_set('display_errors', 'on');
|
||
|
error_reporting(E_ALL);
|
||
|
|
||
|
if (is_callable('opcache_reset')) {
|
||
|
opcache_reset();
|
||
|
}
|
||
|
|
||
|
App::loadAllConfig(['route']);
|
||
|
|
||
|
worker_start('$processParam', $configParam);
|
||
|
|
||
|
if (DIRECTORY_SEPARATOR != "/") {
|
||
|
Worker::\$logFile = config('server')['log_file'] ?? Worker::\$logFile;
|
||
|
TcpConnection::\$defaultMaxPackageSize = config('server')['max_package_size'] ?? 10*1024*1024;
|
||
|
}
|
||
|
|
||
|
Worker::runAll();
|
||
|
|
||
|
EOF;
|
||
|
$processFile = $runtimeProcessPath . DIRECTORY_SEPARATOR . "start_$processParam.php";
|
||
|
file_put_contents($processFile, $fileContent);
|
||
|
return $processFile;
|
||
|
}
|
||
|
|
||
|
if ($monitorConfig = config('process.monitor.constructor')) {
|
||
|
$monitor = new Monitor(...array_values($monitorConfig));
|
||
|
}
|
||
|
|
||
|
function popen_processes($processFiles)
|
||
|
{
|
||
|
$cmd = '"' . PHP_BINARY . '" ' . implode(' ', $processFiles);
|
||
|
$descriptorspec = [STDIN, STDOUT, STDOUT];
|
||
|
$resource = proc_open($cmd, $descriptorspec, $pipes, null, null, ['bypass_shell' => true]);
|
||
|
if (!$resource) {
|
||
|
exit("Can not execute $cmd\r\n");
|
||
|
}
|
||
|
return $resource;
|
||
|
}
|
||
|
|
||
|
$resource = popen_processes($processFiles);
|
||
|
echo "\r\n";
|
||
|
while (1) {
|
||
|
sleep(1);
|
||
|
if (!empty($monitor) && $monitor->checkAllFilesChange()) {
|
||
|
$status = proc_get_status($resource);
|
||
|
$pid = $status['pid'];
|
||
|
shell_exec("taskkill /F /T /PID $pid");
|
||
|
proc_close($resource);
|
||
|
$resource = popen_processes($processFiles);
|
||
|
}
|
||
|
}
|