在 PHP 中,可以使用多進程庫 pcntl 擴展來實現多進程之間的通信。以下是一個簡單的示例,展示了如何使用 pcntl 擴展創建兩個子進程,并通過信號量進行通信。
首先,確保已經安裝了 pcntl 擴展。在命令行中運行以下命令來檢查是否已安裝:
php -m | grep pcntl
如果未安裝,請根據您的操作系統和 PHP 版本安裝 pcntl 擴展。
接下來,創建一個名為 process_communication.php
的文件,并添加以下代碼:
<?php
// 定義信號量
$semaphore = ftok(__FILE__, 't');
$sem = sem_get($semaphore, 1, 0644, 1);
if (sem_acquire($sem)) {
echo "子進程 PID: " . getmypid() . PHP_EOL;
// 執行一些操作
sleep(5);
// 向父進程發送信號
$parent_pid = posix_getpid();
pcntl_kill($parent_pid, SIGUSR1);
// 釋放信號量并等待父進程處理信號
sem_release($sem);
pcntl_waitpid($parent_pid, $status);
} else {
echo "無法獲取信號量,可能是父進程已退出。" . PHP_EOL;
}
現在,創建一個名為 parent_process.php
的文件,并添加以下代碼:
<?php
// 定義信號量
$semaphore = ftok(__FILE__, 't');
$sem = sem_get($semaphore, 1, 0644, 1);
if (sem_acquire($sem)) {
echo "父進程 PID: " . getmypid() . PHP_EOL;
// 等待子進程發送信號
pcntl_waitpid(-1, $status, WNOHANG);
// 處理子進程信號
if ($status == 0) {
echo "收到子進程信號,處理完成。" . PHP_EOL;
} else {
echo "子進程已退出。" . PHP_EOL;
}
// 釋放信號量
sem_release($sem);
} else {
echo "無法獲取信號量,可能是父進程已退出。" . PHP_EOL;
}
運行 parent_process.php
文件作為父進程:
php parent_process.php
然后運行 process_communication.php
文件作為子進程:
php process_communication.php
在這個示例中,父進程和子進程通過信號量進行通信。子進程在完成一些操作后向父進程發送 SIGUSR1 信號,父進程等待并處理該信號。這樣,您可以實現多進程之間的通信。