2012-10-25 160 views
0

我試圖做一個貝寶IPN系統,這是一個貝寶系統自動檢查匯款。他們提供了一個基本的系統腳本來完成它。php腳本可以停止?

系統很簡單,你在腳本上得到$ _POST [],然後打開一個套接字與貝寶,然後他們迴應你在套接字中有效或無效的單詞。

我的問題是,打開套接字,我失去了50%的連接時間。腳本連接時,我沒有任何問題。所以,我把它改成20名改掉,而不是1:

<? 

//... 

mail("[email protected]", "subject", "executing", "some headers"); //mailme when this is execute 

$try = 20; 
do{ 
    $fp = @fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 15); 
    $try--; 
}while($try>0 && !$fp); 

if (!$fp) { // HTTP ERROR 

mail("[email protected]", "subject", "error_message_not_connecting", "some headers"); 

} else { 

mail("[email protected]", "subject", "connected_reading_socket", "some headers"); 

//fputs(..); and the loop reading working. 

} 

?> 

在我的測試,現在的工作severals改掉的100%。但是在實際轉賬中,這個數字不能達到20-30%的時間。我收到第一封郵件,但沒有收到第二封郵件。

我在想..如果貝寶只打開連接到我的服務器1秒,php腳本可以停止一些trys後,停止繼續?或任何想法這裏有什麼問題?

+1

您可以添加一個延遲計數器充當增加了失敗和'sleep'但你'while'循環內部的時間量的計時器。通過這種方式,您將獲得更少嘗試獲得成功連接的機會 – pankar

+0

使用curl - php函數可能更好地處理連接。所以,你可以檢查從連接中獲得的錯誤信息。 – scalopus

+0

@pankar假設你最大的執行時間也增加了。否則,它只會增加你的機會,PHP會阻止你。 – eis

回答

0

我發現的錯誤。當用戶關閉連接到服務器時(通常通過點擊瀏覽器上的停止按鈕,或者在這種情況下,一個由paypal關閉的套接字),php可以停止。

有3種方法可以停止腳本。

1-由光潔度腳本 2由用戶通過3-超時

我所使用的函數ignore_user_abort(真),並且我沒有更多的問題closeing的連接如服務器 。

http://php.net/manual/en/function.ignore-user-abort.php

1

發送郵件可能會失敗,特別是如果您有網絡問題。你應該記錄失敗的條件,既郵件()以及你的fsockopen,所以你可以重新訪問它們之後。

此外,您的fsockopen可能會卡住。您有15秒的超時時間,並且您嘗試了20次,所以您的腳本將工作20 * 15 = 300秒= 5分鐘,這可能比您的PHP腳本超時更長 - > PHP會在您的腳本進程中止,對吧?在PHP中,最大執行時間僅爲30秒。

+0

郵件沒有失敗。無論如何,發送電子郵件後,我有一些插入我的分貝,我沒有任何失敗時。 – user1475451

+0

執行時間是12小時,這是主機說的。當我手動執行20次,連接與否,我沒有問題。我也用更多的時間執行一些腳本,沒有任何問題:( – user1475451

+0

@ user1475451,以便告訴你a)腳本在進程中停止,b)連接失敗,郵件發送失敗,可能具有相同的根本原因。根據代碼,他們中的任何一個都可能是原因,儘管你是對的,如果第一次調用郵件的工作,我會調查一下)。正確的日誌記錄將有助於診斷。我假設你已經檢查過服務器的錯誤日誌。 – eis

0

PHP腳本可以使用exit;停止。 您可以暫停使用sleep(nr_sec)處理php腳本。