| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | <?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<?phprequire_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);    }}
 |