2015-06-30 210 views
0

我通過PHP文件一樣執行一個守護進程文件:EXEC PHP需要很長的時間

echo exec("php -q /var/www/project/server.php"); 

,但它需要這麼長的時間,而且也注意到,它開創了相同的像兩個過程:

5558 ?  S  0:00 sh -c php -q /var/www/project/server.php 

5559 ?  S  0:00 php -q /var/www/project/server.php 

那麼請幫助我,爲什麼它創建兩個進程?

如何加速執行?

我使用PHP 5.5,Ubuntu的

更新

我對WebSocket的 使用棘輪這裏是server.php

<?php 
use Ratchet\Server\IoServer; 
use Ratchet\WebSocket\WsServer; 

$server = IoServer::factory(
    new WsServer(
     new DraftAuction() 
    ) 
    , 8181 
); 

$server->run(); // If I comment this line getting response faster but I cant do that, this line keeps process in continues running mode. 
+0

您的輸出表明PHP花費了0秒的CPU時間來執行。也許'server.php'中的某些代碼掛起或阻塞等待系統事件。嘗試找到阻止執行的行,並在此處發佈代碼。 –

+0

PHP在shell中執行傳遞給'exec()','system()','shell_exec()','popen()'或'proc_open()'的命令。這就是爲什麼你看到兩個過程。問題的另一部分:*「爲什麼需要這麼長時間」*顯然無法回答,因爲您的問題缺少重要信息。 – hek2mgl

+0

@DmitryGrigoryev&hek2mgl:謝謝你的回答,問題更新了,請幫我解決... –

回答

2

進程5558是你的shell。在那裏產生子進程5559,它是運行PHP腳本的實際進程,即WebSocket服務器。進程5558將繼續等待,直到子進程完成其執行。 (具體來說,它正在等待子進程從終端分離,通過正常終止(包括自己成爲守護進程),或者通過成爲後臺進程並分離其輸出。)

您的第一個PHP具有exec()語句的腳本正在等待創建的過程,以在它返回任何值之前完成執行。由於5558將不會返回,直到5559返回,您的第一個PHP腳本也不會返回。

的選項有:

  1. 把你server.php腳本轉換爲守護進程。
  2. 劇本開始前從終端上分離。

在選項一中,fork,kill parent,關閉STDOUT和STDERR,再次fork,殺死父項。不,我不會詳細討論,因爲要做到這一點,正義實際上需要一本關於Posix過程的完整章節,才能在厚厚的參考書中找到答案。

在方案二,具體如下更改exec()聲明:

exec("php -q /var/www/project/server.php >/dev/null 2>&1 &"); 

這是你的輸出重定向到/dev/null(無門),並將其進程爲背景狀態。 echo沒有意義,因爲沒有什麼可以打印出來的。

然後你的shell就可以退出了(沒有什麼可以等待的),並且你的原始腳本可以成功完成,一個新的WebSocket服務器運行無頭。

而且,我想指出真正的快速:這真的不是一個WebSocket問題,也不是一個編程問題。這是一個Unix/Linux問題,並且問題的根源在SuperUser上得到了更徹底的回答:https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely

+0

太好了,非常感謝 –

0

由於胡亂猜測的代碼,甚至應該返回$server->run();?它看起來像監聽端口8181,等待客戶端連接,它可能永遠不會退出。

+0

對呀,那會留在跑步模式,所以如何處理這種情況,請幫助我 –

+0

好吧, t需要它運行,爲什麼你首先啓動它?你對運行服務器有什麼期望? –