0

我正在尝试制作一个贝宝 IPN 系统,这是一个贝宝自动检查汇款的系统。他们提供了一个基本的系统脚本来做到这一点。

该系统很简单,您在脚本上获得 $_POST[],然后打开一个套接字与贝宝,它们会响应您在套接字中的有效或无效单词。

我的问题是打开套接字,我有 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% 的多次尝试。但在实际传输中,它不会在 20-30% 的时间内起作用。我收到了第一封邮件,但第二封邮件从未失败。

我在想.. 如果贝宝只打开到我的服务器的连接 1 秒,php 脚本可以在尝试后停止并停止继续吗?或者知道这里有什么问题吗?

4

4 回答 4

1

发送邮件也可能失败,尤其是当您遇到网络问题时。您应该记录 mail() 和 fsockopen 的失败条件,以便之后重新访问它们。

此外,您的 fsockopen 可能会卡住。您有 15 秒的超时时间,并且您尝试了 20 次,因此您的脚本将工作 20*15=300 秒 = 5 分钟,这可能比您的 PHP 脚本超时时间长 - > PHP 会在中途中止您的脚本,对吧?默认情况下,PHP 的最大执行时间仅为 30 秒。

于 2012-10-25T15:23:22.297 回答
0

PHP 脚本可以用exit;. 您可以使用 暂停 php 脚本处理sleep(nr_sec)

于 2012-10-25T15:24:16.570 回答
0

我发现了错误。当用户关闭与服务器的连接时(通常通过单击浏览器上的停止按钮,或者在这种情况下是由贝宝关闭的套接字),可以停止 php。

有 3 种方法可以停止脚本。

1-通过完成脚本 2-通过用户关闭与服务器的连接 3-通过超时

我使用了函数ignore_user_abort(true),我没有更多问题。

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

于 2012-11-11T17:13:40.957 回答
0

我曾经遇到过类似的问题。使用套接字时的奇怪行为。最好改用 CURL,它更稳定。

http://leepeng.blogspot.com/2006/04/standard-paypal-php-integration.html

于 2012-10-25T15:42:02.353 回答