/** * log_message : log message * @param string $level log level * @param string $message message * @return None */ function log_message($level, $message = '') { $level = strtoupper($level); $begin = ''; $end = ''; $log = AppServer::get_instance()->get_log_file(); if (empty($log)) { switch ($level) { case 'ERROR': $begin = "[1;31;40m"; $end = "[0m"; break; case 'INFO': $begin = "[1;32;40m"; $end = "[0m"; break; default: break; } } $output = $begin . date('m-d H:i:s') . ' @' . getmypid() . ' : [' . $level . '] ' . $message . $end . PHP_EOL; if (empty($log)) { fwrite(STDERR, $output); } else { $lock = new swoole_lock(SWOOLE_MUTEX); $lock->lock(); $fp = fopen($log, 'a+'); fwrite($fp, $output); fclose($fp); $lock->unlock(); } }
<?php $workers = []; $worker_num = 3; //创建的进程数 $finished = false; $lock = new swoole_lock(SWOOLE_MUTEX); for ($i = 0; $i < $worker_num; $i++) { $process = new swoole_process('process'); //$process->useQueue(); $pid = $process->start(); $workers[$pid] = $process; } foreach ($workers as $pid => $process) { //子进程也会包含此事件 swoole_event_add($process->pipe, function ($pipe) use($process, $lock, &$finished) { $lock->lock(); if (!$finished) { $finished = true; $data = $process->read(); echo "RECV: " . $data . PHP_EOL; } $lock->unlock(); }); } function process(swoole_process $process) { $response = 'http response'; $process->write($response); echo $process->pid, "\t", $process->callback . PHP_EOL; }
<?php /** * SWOOLE_MUTEX 互斥锁 * SWOOLE_FILELOCK 文件锁,需要在第二个参数传入一个锁文件 * SWOOLE_SPINLOCK 自旋锁(请查看swoole扩展信息,检测是否支持) * SWOOLE_SEM 信号量 * SWOOLE_RWLOCK 读写锁 */ $lock = new swoole_lock(SWOOLE_MUTEX); echo "[Master]create lock\n"; $lock->lock(); if (pcntl_fork() > 0) { sleep(1); $lock->unlock(); } else { echo "[Child] Wait Lock\n"; $lock->lock(); echo "[Child] Get Lock\n"; $lock->unlock(); exit("[Child] exit\n"); } echo "[Master]release lock\n"; unset($lock); sleep(1); echo "[Master]exit\n";
/** * release_sys_plugins : release system plugins * @param int $workerId worker id * @return boolean Operation result */ public function release_sys_plugins($workerId) { if (!isset($this->_sys_plugins[$workerId])) { return false; } $plugins =& $this->_sys_plugins[$workerId]; $cfg = $this->config->get('sys_plugin', array()); $lock = new swoole_lock(SWOOLE_MUTEX); $lock->lock(); while (count($cfg) > 0) { $name = array_pop($cfg); if (isset($plugins[$name])) { if (!$plugins[$name]->uninit()) { log_message('error', 'Failed to uninit plugin : ' . $name); } unset($plugins[$name]); } } $lock->unlock(); }