0

こんにちは、私は PHP が初めてで、私が尋ねようとしていることが可能であるかどうか、または意味があるかどうかさえわかりませんが、ここに行きます。

WebServer でスタンドアロン アプリケーションを実行しているかのように PHP スクリプトを実行したいのですが、実装しようとしているのは、顧客が Web サイトで何かを購入し、Web サイトで支払い確認通知が表示されたら、ユーザーが支払いが成功したことを表示するページに移動すると開始される大きな注文生成プロセスに影響を与えることなく、ブラウザ ウィンドウを閉じたりログオフしたりできます。

現在、私はAJAXを利用して支払い処理後のPHPスクリプトを呼び出しており、そのスクリプトを保持してユーザーの中止呼び出しを無視しています。

これは、支払いが正常に受領されたことをユーザーに伝えるページです。

ありがとう.php

これは、支払いが正常に受領された後にのみ実行する必要がある処理を実行するページです

FinishCheckoutProcess.inc.php

これで、 thankyou.phpは AJAX を使用してFinishCheckoutProcess.inc.phpを非同期的に実行し、 FinishCheckoutProcess.inc.phpには次のような PHP.ini 設定が含まれています。

AJAX と ignore_user_abort(true) の組み合わせにより、ユーザーがブラウザ ウィンドウを閉じてもエラーなしで支払いプロセスを実行できますが、このスクリプトはユーザーやブラウザとは関係がないため、ブラウザから独立したスタンドアロン アプリケーションのように、このスクリプトをバックグラウンドで実行できます。

また、私の WebServer は Apache で、OS は Linux(Ubuntu OS) です。

私の仕事は終わっていますが、それを行うためのより良い/安全な方法があるかどうか知りたいだけです.

このサイトは、どの本よりも私を助けてくれました。ですから、私のような初心者に時間を寄付してくれる専門家の皆さんは素晴らしいです。これからも頑張ってください。

再びどうもありがとう。


受け取った提案に基づいて、「exec」メソッドを使用して FinishCheckoutProcess.inc.php を実行すると、データベース関連のコマンドが実行され、さらに PHP スクリプトを実行できるようになります。

FinishCheckoutProcess.inc.phpは、他の PHP スクリプトを実行する一連の他の PHP スクリプトを順番に実行するため、「exec」コマンドを使用して FinishCheckoutProcess.inc.php を実行すると、問題が発生します。

FinishCheckoutProcess.inc.phpプロセスは MySQL データベースとの対話も行うため、このスクリプトを「 exec」コマンドを使用して実行すると、これを行うことができます。現在、必要な MySQLi 接続オブジェクトをこの PHP スクリプトに渡しています。「 exec」を使用して同じ方法で渡すことができますか

また、 IMagickImageMagickを使用して 4 つの画像ファイルのセットを生成するため、プロセスは非常に重くなります。

注文されたすべての製品に対して 4 つの画像ファイルのセットが生成されるため、1 つの製品の数量が 10 の場合、生成されるファイルの合計は 1x10x4 = 40 になります。

一方の数量が 2 で、もう一方の数量が 4 の 2 つの製品がある場合、生成されるファイルの合計は 1x2x4 = 8 + 1x4x4 = 16 = 24 になります。

そのため、このスクリプトは長時間実行する必要があり、タイムアウトの理由で停止することはできません。開始したことを終了する必要があります。

基本的に、FinishCheckoutProcess.inc.phpのロジックとプロセスは非常に複雑なので、「exec」がそれを処理できるかどうかを確認したいだけです。

また、よくわかりませんが、それらのいくつかは $_SESSION 変数も使用していますが、これが問題である場合は変更できます。$_SESSION 変数は 1 か所でのみ使用され、$_SESSION はFinishCheckoutProcess の前にブラウザーで設定されます。 inc.phpスクリプトが実行されます。いくつかの以前の PHP スクリプトによって。

親/呼び出しスクリプト、つまり thankyou.php とは無関係に FinishCheckoutProcess.inc.php スクリプト実行したいだけなので、ユーザーがブラウザを閉じても、親/呼び出しスクリプトのためにFinishCheckoutProcess.inc.phpが停止または中止されません。つまり、 thankyou.phpは実行されなくなりました。

4

2 に答える 2

1

私が理解していることから、Laravelがilluminate/queueパッケージで提供するようなものを探しています:

キューを使用すると、電子メールの送信などの時間のかかるタスクの処理を後で延期することができ、アプリケーションへの Web 要求が大幅に高速化されます。

これは Laravel だけが提供するものではありませんが、そのようなメカニズムの実装を単純化/容易化します。

バックグラウンドsupervisordで、共通の場所 (db テーブル、ファイルシステムなど) に配置したタスクを実行する「ワーカー」php スクリプトを実行しています。これらのタスクは通常、特定のクラス/メソッドへの参照であり、それに送信する変数があります。

次のリンクを参照すると、理解が深まる場合があります。

を使用せずに、キュー システムを実装する方法は多数ありますsupervisord。しかし、サーバーの再起動後も(適切に構成されている場合)、タスクが処理されることが保証されるため、最近この方法を自分で実装しました。

于 2016-02-10T11:56:04.827 に答える
1

参考までに、のような php スクリプトを実行できますphp my/script.php

これを行うためのより安全な方法は、マスター/ワーカー プロセス ワークフローを使用することです。マスター プロセスはサーバー上で実行され、作業のキューをチェックし、ワーカー プロセスを生成して、到着時にキュー上のアイテムを処理します。

あなたのシナリオでは、ユーザーが支払うときにキューに物を追加します。それがキューに追加されると、ユーザーに thankyou.php を送り返すことができ、ユーザーは続行したり、離れたりすることができます。作業がキューに入ると、マスター プロセスがワーカー プロセスを生成して処理を行います (基本的に、FinishCheckoutProcess.inc.php ですべてを実行します)。

master.phpを使用して、これを php で実装できます。php master.php

while( true ){
    //check queue
    //if found queue item
       //shell_exec( 'php worker.php' );
}
于 2013-07-18T16:10:21.757 に答える