0

私はペイパルIPNシステムを作ろうとしています。これは自動的に送金をチェックするペイパルのシステムです。それらはそれを行うための基本的なシステムスクリプトを提供します。

システムは簡単で、スクリプトで$ _POST []を取得し、ペイパルではなくソケットを開くと、ソケット内の有効または無効な単語に応答します。

私の問題は、ソケットを開くと、50%の確率で接続が失われることです。スクリプトが接続されたら、問題はありません。そこで、1回ではなく20回の試行に変更しました。

<?

//...

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%の確率で機能しません。最初のメールを受信して​​いますが、2番目のメールが失敗することはありません。

私は考えています..ペイパルが私のサーバーへの接続を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

私は以前同様の問題を抱えていました。ソケットを使用するときの奇妙な動作。代わりにCURLを使用すると、より安定します。

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

于 2012-10-25T15:42:02.353 に答える
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 に答える