我正在尝试建立一个PayPal IPN系统,这是一个自动检查汇款的贝宝系统。它们提供了一个基本的系统脚本来完成它。
系统很简单,你的脚本上有$ _POST [],然后打开套接字而不是paypal,它们会在套接字中响应你有效或无效的字。
我的问题是打开插座,50%的时间我连接丢失了。当脚本连接时,我没有任何问题。所以我把它改成了20个小时,而不是1:
<?
//...
mail("mi@mail.com", "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("mi@mail.com", "subject", "error_message_not_connecting", "some headers");
} else {
mail("mi@mail.com", "subject", "connected_reading_socket", "some headers");
//fputs(..); and the loop reading working.
}
?>
在我的测试中,它现在100%的几个trys工作。但在实际转让中,它不会有20-30%的时间。我收到第一封邮件,但从来没有第二封邮件失败。
我在想..如果PayPal只打开与我的服务器的连接1秒,那么php脚本可以在一些尝试后停止,并停止继续吗?或任何想法在这里有什么问题?
答案 0 :(得分:1)
发送邮件也会失败,尤其是在遇到网络问题时。您应该记录mail()和fsockopen的失败条件,以便之后可以重新访问它们。
此外,您的fsockopen可能会卡住。你有15秒的超时,你尝试20次,所以你的脚本将工作20 * 15 = 300秒= 5分钟,这可能比你的PHP脚本超时 - &gt; PHP会中途处理你的脚本,对吗?默认情况下,PHP中的最长执行时间仅为30秒。
答案 1 :(得分:0)
可以使用exit;
停止PHP脚本。
您可以使用sleep(nr_sec)
暂停php脚本处理。
答案 2 :(得分:0)
我曾经遇到过类似的问题。使用套接字时的奇怪行为。 更好地使用CURL,它更稳定。
http://leepeng.blogspot.com/2006/04/standard-paypal-php-integration.html
答案 3 :(得分:0)
我发现了错误。当用户关闭连接到服务器的连接时,可以停止php(通常通过浏览器上的单击停止按钮,或者在这种情况下通过paypal关闭套接字)。
有三种方法可以停止脚本。
1 - 完成脚本 2 - 用户关闭服务器的连接 3-by timeout
我使用函数ignore_user_abort(true),我没有更多问题。