ホームページ >バックエンド開発 >PHPチュートリアル >curl - 拡張機能をインストールせずにphpで非同期操作を実装する方法

curl - 拡張機能をインストールせずにphpで非同期操作を実装する方法

WBOY
WBOYオリジナル
2016-08-18 09:15:541370ブラウズ

リクエスト処理を受け取った後、WeChat インターフェースをリクエストする必要があり、多くの注文を処理し、WeChat インターフェースを呼び出す必要がある非常に時間のかかる操作がありました。これらの操作をエコー後に実行したいと考えています。メッセージキューはサーバーにmemcacheqなどの拡張機能をインストールする必要があります。サーバーを操作する権限がないため、コードで解決したいと考えています。メッセージキューを実装することは可能ですか? キューの操作について何も知らない人がいますか? fsockopen を使用して実装することもできるとのことですが、これとメッセージ キュー メカニズムの違いは何ですか?

返信内容:

リクエスト処理を受け取った後、WeChat インターフェースをリクエストする必要があり、多くの注文を処理し、WeChat インターフェースを呼び出す必要がある非常に時間のかかる操作がありました。これらの操作をエコー後に実行したいと考えています。メッセージキューはサーバーにmemcacheqなどの拡張機能をインストールする必要があります。サーバーを操作する権限がないため、コードで解決したいと考えています。メッセージキューを実装することは可能ですか? キューの操作について何も知らない人がいますか? fsockopen を使用して実装することもできるとのことですが、これとメッセージ キュー メカニズムの違いは何ですか?

リーリー

変数 $arg は、task.php の $argv[1] を通じて取得されるパラメータです。
timeout 60 は、task.php スクリプトの最大実行時間が 60 秒であることを意味します。必要ない場合は削除できます。
pclose(popen()) による非同期実装の本質は、ブロック コードを実行するプロセスを開くことです。
後で自動的に結果 (コールバック) を返す必要がない非同期シナリオに適しています。実行が完了しました

文字列パラメータ $arg は一重引用符で囲むことができ、これにより一部のスペースの影響を回避できますが、依然として欠陥があります
シェル インジェクション (SQL インジェクションと比較して) を回避するには、文字列パラメータをシリアル化することが最善です。
次に、ファイル パス パラメーターをスクリプト task.php に渡し、task.php にファイルを読み取り、シリアル化解除、シリアル化解除してデータを取得させます。
ファイル名は一意である必要があります。たとえば、ユーザー名にすることができます。 ID + プロセス PID + 時間乱数:

リーリー

PHP-FPM が提供する関数fastcgi_finish_request は、すべての応答データをクライアントにフラッシュしてリクエストを終了することができます。これにより、クライアントは、キャッシュの生成など、接続の終了後もユーザーに出力する必要のないコードを実行し続けることができます。ただし、現在の FPM ワーカー プロセスはブロックされます。
http://php.net/manual/zh/func...

fsockopen は、(curl と同様に) リクエストを行うが、結果が返されるのを待たないことを意味します。

したがって、fsockopen を使用することもできます。エコーした後、fsockopen は WeChat インターフェースのローカル操作を要求します。これで問題ありません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。