2011-06-09 19 views
1

我想用插座實現使用PHP(不幸的是它必須在PHP中)的簡單應用程序。我有一個頁面 - 讓我們說multi.php和頁面client.php的許多實例 我不想將一些數據從multi.php的一個實例發送到client.php的所有實例,而沒有文件或數據庫。PHP多點回送

我試圖使用多播(使用多播地址從multi.php發送一些數據),但它不起作用。我不能提前

+0

你叫什麼'client.php'的實例?一個腳本爲每個HTTP請求實例化一次,並在發送HTTP響應時被銷燬。 PHP在Apache請求中沒有運行的活動代碼。 – 2011-06-09 19:42:41

+0

那不完全正確。如果PHP在Apache或其他Httpds中運行,您可以將'max_execution_time'設置爲0並設置'inore_user_abbort(true)'。在這種情況下,php腳本甚至可以在web服務器上運行,直到完成或webseerver關閉,並且在這種情況下,如果HTTP請求未完成,它將不起作用。 如果您在命令行上運行php腳本,則默認情況下,運行時間限制爲運行時。 – Radon8472 2013-10-28 06:40:28

回答

0

與client.php的任何實例

謝謝你溝通你不能做與PHP播現在。見http://bugs.php.net/bug.php?id=40510

你可以做的只是發送相同的數據到所有的套接字。你有一個服務器進程(multi.php)接受連接。該過程只是將相同的數據發送給所有打開的連接。這是你試圖達到的目標嗎?

+0

或多或少...在你的解決方案我需要從client.php連接到multi.php並檢索數據。 multi.php需要在後臺工作。但在我的問題multi.php開始把一些數據,它退出... client.php的所有實例需要在後臺工作,並監聽數據。 – 2011-06-09 19:59:12

+0

那麼你真正要做的是發送一個廣播到所有client.php進程?這並不容易。你的先決條件非常有限。我認爲你必須在multi.php可以請求所有有效的client.php進程列表的地方註冊所有啓動的client.php進程。你的進程在同一臺物理機器上嗎?然後你可以使用一些IPC方法,例如信號量或共享內存段。 – ckruse 2011-06-09 20:08:49

+0

是的,所有進程都在同一臺物理機器上。共享內存可能是一個好的解決方案。我還有一個想法,但我找不到如何實現它 - 是否有任何可能性通知client.php的所有實例,某處是一些新的數據(例如在某些文件或數據庫中)?只是通知.. – 2011-06-09 21:21:32

4

我目前在PHP中構建一個類,供私人使用。隨着班級我將控制MediaRender設備。在mSearch方法中,您可以看到如何在PHP中實現多播效果的示例。

// BUILD MESSAGE 
    $msg = 'M-SEARCH * HTTP/1.1' . "\r\n"; 
    $msg .= 'HOST: 239.255.255.250:1900' ."\r\n"; 
    $msg .= 'MAN: "'. $man .'"' . "\r\n"; 
    $msg .= 'MX: '. $mx ."\r\n"; 
    $msg .= 'ST:' . $st ."\r\n"; 
    $msg .= 'USER-AGENT: '. static::USER_AGENT ."\r\n"; 
    $msg .= '' ."\r\n"; 

    // MULTICAST MESSAGE 
    $sock = socket_create(AF_INET, SOCK_DGRAM, 0); 
    $opt_ret = socket_set_option($sock, 1, 6, TRUE); 
    $send_ret = socket_sendto($sock, $msg, strlen($msg), 0, '239.255.255.250', 1900); 

    // SET TIMEOUT FOR RECIEVE 
    socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>$sockTimout, 'usec'=>'0')); 

    // RECIEVE RESPONSE 
    $response = array(); 
    do { 
     $buf = null; 
     @socket_recvfrom($sock, $buf, 1024, MSG_WAITALL, $from, $port); 
     if(!is_null($buf))$response[] = $this->parseMSearchResponse($buf); 
    } while(!is_null($buf)); 

    // CLOSE SOCKET 
    socket_close($sock); 

https://github.com/artheus/PHP-UPnP/blob/development/phpupnp.class.php

+0

我稱之爲「多播效應」,因爲我不確定這是否完全遵循「多播」技術術語作爲標準。很高興知道這是否是。 – 2012-11-05 09:10:12

+0

'socket_set_option($ sock,1,6,TRUE)'是什麼意思?什麼是'1'和'6'?當我使用這個代碼時,我得到了這個警告:'PHP Warning:socket_set_option():無法設置套接字選項[22]:無效參數' – TheFox 2014-04-20 14:27:03