2012-01-19 40 views
4

例如:我怎麼能不PHP腳本執行外部程序中斷

//test.php 
#! /usr/local/php/bin/php 
<?php 
exec('nohup ./loop.php > loop.out'); 
echo 'I am a superman!'; 

//loop.php 
#! /usr/local/php/bin/php 
<?php 
$count = 0; 
while (true) { 
    echo "Loop count:{$count}\n"; 
    $count++; 
} 

當我運行./test.php我不能得到的輸出「!我是超人」,你知道循環.php是一個無限循環,test.php被loop.php中斷,所以我怎樣才能得到輸出?任何幫助表示讚賞。

回答

3

還有就是你可以做到這一點的方法了一堆:

運行後臺進程使用&

exec('nohup ./loop.php > loop.out 2>&1 &'); 

使用pcntl_fork,並從子運行您的程序:

$pid = pcntl_fork(); 
switch ($pid){ 
    case -1: 
    die('Fork failed'); 
    break; 
    case 0: 
    exec('nohup ./loop.php > loop.out'); 
    exit(); 
    default: 
    break; 
} 
echo "I'm not really a superman, just a parent process'; 

有更多的方法來做到這一點,只是潛伏在PHP文檔和這裏的問題...

2

要做到在PHP中,你會想使用類似Gearmanbeanstalkd

+1

+1我是beanstalkd的粉絲,但核心信息是一樣的:排隊。除此之外,這可讓您輕鬆控制同時作業的最大數量 - 不會運行比您能處理的更多隊列消費者。 –

+0

我從來沒有聽說過beanstalkd,它看起來非常好!更新的答案包含對它的引用 – wyqydsyq

0

這是不是一個好主意,有一個「永不落幕」循環運行的異步進程。如果您需要頻繁運行特定任務,請考慮使用由服務器操作系統提供的Cron作業,而不是實際上屬於PHP的一部分。另外,如果您的PHP代碼的一部分需要大量時間來執行,您應該更改您的設計方法,以將作業放入數據庫中排隊,並讓外部Job Scheduler處理它。

看看this發佈瞭解更多詳情。

+0

Cron作業應該是一種經常處理任務的好方法,但我只想運行一個外部程序而不用等待它完成。另外,我想通過php腳本邏輯啓動外部程序,而不是固定頻率的任務。 – Joel