137 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Start file for windows
 | 
						|
 */
 | 
						|
chdir(__DIR__);
 | 
						|
require_once __DIR__ . '/vendor/autoload.php';
 | 
						|
 | 
						|
use Dotenv\Dotenv;
 | 
						|
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';
 | 
						|
$paths = [
 | 
						|
    $runtimeProcessPath,
 | 
						|
    runtime_path('logs'),
 | 
						|
    runtime_path('views')
 | 
						|
];
 | 
						|
foreach ($paths as $path) {
 | 
						|
    if (!is_dir($path)) {
 | 
						|
        mkdir($path, 0777, true);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
$processFiles = [];
 | 
						|
if (config('server.listen')) {
 | 
						|
    $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();
 | 
						|
}
 | 
						|
 | 
						|
if (!\$appConfigFile = config_path('app.php')) {
 | 
						|
    throw new RuntimeException('Config file not found: app.php');
 | 
						|
}
 | 
						|
\$appConfig = require \$appConfigFile;
 | 
						|
if (\$timezone = \$appConfig['default_timezone'] ?? '') {
 | 
						|
    date_default_timezone_set(\$timezone);
 | 
						|
}
 | 
						|
 | 
						|
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')) {
 | 
						|
    $monitorHandler = config('process.monitor.handler');
 | 
						|
    $monitor = new $monitorHandler(...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);
 | 
						|
    }
 | 
						|
}
 |