}); $client->on("receive", function (swoole_client $cli, $data) use($pid) { lg("[{$pid}] Received: {$data}", __LINE__); $cli->close(); }); $client->on("error", function (swoole_client $cli) use($pid) { $cli->close(); //lg("[$pid] error then conn close", __LINE__); exit(0); }); $client->on("close", function (swoole_client $cli) use($pid) { //lg("[$pid] conn close", __LINE__); }); $client->connect('127.0.0.1', 8001, 0.5); //lg("[$pid] create conn succ", __LINE__); exit(0); } if (isset($argv[1])) { $daemon = new Daemon(['func' => 'send', 'fork_num' => 1]); switch ($argv[1]) { case 'r': $daemon->run(); break; case 'k': $daemon->stop(); break; case 's': $daemon->status(); break; } }
$dummy = new dummy(); $dummy->setuniq(); echo "Starting new child with: {$dummy->uniqid}\n"; $daemon->childObject = $dummy; return TRUE; } function childDying(&$daemon, $pid) { echo "Child with: {$daemon->currentObjects[$pid]->uniqid} terminating\n"; } class dummy { public $uniqid = NULL; function setuniq() { $this->uniqid = uniqid(); } function stack() { while (1) { sleep(2000); } } } $job = new Daemon(); $job->procName = 'phpdaemon'; $job->bind('onLauncher', 'childStart'); $job->bind('onLaunchJob', 'childJob'); $job->bind('onChildTerminated', 'childDying'); $job->run();
<?php require __DIR__ . '/libs/local.php'; require __DIR__ . '/libs/daemon.php'; require __DIR__ . '/libs/ElephantIO/Client.php'; ini_set('display_errors', 1); error_reporting(E_ALL); // TODO: Придумать, где брать путь $logs_dir = __DIR__ . '/../../../../temp/logs/network/'; try { $daemon = new Daemon($logs_dir); $pid = $daemon->run(); // TODO: Добавить периодическую проверку pid-файла на всякий случай. } catch (Exception $e) { exit($e->getMessage()); } $local = new Local(); $events_dir = $local->get_events_dir(); if (!is_dir($events_dir)) { mkdir($events_dir, 0777, true); } $local->save_daemon_pid($pid); $local->log('info', 'Daemon started with pid "' . $pid . '"', 'fast'); $conn_data = $local->get_connection_data(); // TODO: Реакция на отключение сервера. $elephant = new ElephantIO\Client($conn_data['url'], 'socket.io', 2, true, true, $local->is_debug(), $conn_data['namespace'], '127.0.0.1', 10000, 'file', $events_dir); $elephant->setLogger($local); $elephant->setLicence($conn_data['key'], $conn_data['domain']); foreach ($local->get_events() as $event) { $elephant->on($event, function ($data) use($event, $local) { $local->log('info', 'Event received: ' . $event . '(' . serialize($data) . ')', 'fast');
exit(0); } // Делаем основным процессом дочерний... posix_setsid(); // Включаем тики, в противном случае скрипт просто повисает и не реагирует на внешние раздражители... declare (ticks=1); // Здесь я подключаю всякую нужную штуку... include __DIR__ . '/Daemon.php'; include __DIR__ . '/ExampleClass.php'; // Класс изображающий полезную нагрузку... $example = new ExampleClass(); // Именно эта функция делает всякую полезую нам нагрузку, которую мы хотим демонизировать... // Если нам нужны какие-нибудь классы не забываем упомянуть их тут в противном случае простоо не получите к ним доступ... $func = function () use($example) { // Тут живёт всякая полезная нагрука... $example->test(); return true; }; // Собственно создаём демона, соответственно говорим ему куда записывать свой pid... $daemon = new Daemon('/tmp/daemon.pid'); // Закрываем порочные связи со стандартным вводом-выводом... fclose(STDIN); fclose(STDOUT); fclose(STDERR); // Перенаправляем ввод-вывод туда куда нам надо или не надо... $STDIN = fopen('/dev/null', 'r'); $STDOUT = fopen('/dev/null', 'wb'); $STDERR = fopen('/dev/null', 'wb'); // Запускаем функцию несущую полезную нагрузку... $daemon->run($func);
<?php include_once 'daemon.php'; Daemon::run(); // declare(ticks=1); //pcntl_signal(SIGUSR1, function() { // echo 'Got SIGUSR1'; //}); for ($i = 0; $i < 1800; $i++) { echo "\n{$i}"; sleep(1); }