問題タブ [k2f]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHP proc_openが複数回開く
CLI(cmd、bashなど)を介してプログラムを実行するために使用されるユーティリティ機能があります。STDOUT
、STDERR
およびの 3 つの項目の配列を返しますEXIT CODE
。
これまでのところ、問題なくうまく機能しています。実際、私が抱えている問題は機能を妨げるものではありませんが、パフォーマンスが心配です。
問題は、場合によっては、PHP が同じコマンドを複数回 (私の場合は 3 回) 実行することです。
コメント行 (9 行目) に注意してください。それはテスト用でした。これを有効にして、ターゲット プログラムが 1 回だけ実行されるようにしました (コードが何らかの形で同じ関数を呼び出している可能性があると考えていました)。しかし、その行を有効にしても、プログラムは複数回実行されました。
現状では、同じプログラムを (別の機会に) 実行しているコード内の 2 つの場所があります。コマンドラインはどちらも同じです。
ただし、プログラムが 1 回実行される場合と、PHP がプログラムを 3 回実行する場合があります。
Process Explorer でこの動作を監視して確認しています。Windows 7 x64 を使用しています。プログラムは PHP と同様に 32 ビットです。
編集:問題のプログラムはカスタム開発されており、新しいプロセスを開きません。
php - PHP奇妙なDOCUMENT_ROOT
つまり、基本的に、私はフレームワークを作成しており、その機能の一部として、確立されたURI/パスのセットをエンド開発者に提供することになっています。
これらのパスのいくつかは以下を利用します$_SERVER['DOCUMENT_ROOT']
:
コードは、LinuxとWindowsの両方で機能するように微調整されています。どうやら、それはほとんどの場合Linuxで動作し、実際にはVPSでは非常にシームレスです。
しかし、最近、HGリセラーアカウント(共有ホスティング)で試してみたところ、すべて壊れてしまいました。問題のあるマシンの$_SERVER内のデータを印刷しました。
そして私のマシン:
**読み上げるべき部分は、私の問題を完全に説明する必要があります。
つまり、基本的にDOCUMENT_ROOT
は/home/sitename/public_html/
、が期待されますが、代わりに/usr/local/apache/htdocs
。
ああ、そして私が少し冗長すぎたらごめんなさい;)
編集:
getcwd()
=>/home/visitgoz/public_html
__FILE__
=>/home/visitgoz/public_html/K2F/config.php
php - eval()を使用してセキュリティを強化する
タイトルはほとんどキャッチ22であることを認めますが、それは完全に関連しているので、しばらくお待ちください...
バックグラウンド
ご存知かもしれませんが、私はPHPフレームワークに取り組んでいます。その主なセールスポイントは、異なるCMS/システム間で機能をブリッジすることです。開発者の観点からは、広範なエラー処理とロギングのメカニズムがあります。現在、デバッグ出力を制御する2つの設定DEBUG_MODE
とがあります。DEBUG_VERBOSE
モードは媒体を記述し、詳細は詳細の量を制御します。簡単に言うと、「コンソール」と呼ばれるモードがあり、基本的にデバッグ情報をjavascriptコンソールにダンプします(これは現在、お近くの主要なWebブラウザーで使用できます)。
問題
この[デバッグシステム]は開発サーバーには最適ですが、デバッグの詳細(DBクレデンシャルなど)が公開されるため、本番サーバーでは絶対に使用できません。そして正直なところ、開発者から移行した人は誰でしょう。製品に。毎回完璧にサーバー?
ソリューション
したがって、私はこれを修正する方法を見つけようとしてきました。私が提案するソリューションには、次のものがあります。
- リクエストが特定のIPからのものである場合にのみログを有効にするようにフレームワークに指示する設定があります。このためのセキュリティの問題は非常に明白です(とりわけIPスプーフィング)。
- 評価されて返されるPHP式(コード)を含む設定がyes/noとして使用されます。最良の部分は、インストールされたフレームワークがCMS固有の式を提案する可能性があることです。
- Wordpress:
current_user_can('manage_options')
- Joomla:
$user=&JFactory::getUser() && ($user->usertype=='Super Administrator') || ($user->usertype=='Administrator')
- カスタム:
$_SERVER['REMOTE_ADDR']=='123.124.125.126'
- Wordpress:
- これらは2つのうちの1つであり、私はもっと多くの提案を聞きたいと思っています。
eval()
それで、あなたはそれに任せるべきだと思いますか?これをページのロード/リクエストごとに1回だけ実行することで、引き続き良好に機能することを確認します。
明確化
は$USER_CONDITON
、実行などis_admin()
、すべての管理者がデバッグ情報を表示できるようにする、またはgetUser()->id==45
特定のユーザーに対してデバッグ情報を有効にするなどの機能を許可します。またはIPなどで。
php - PHP での適切なシェル実行
問題
proc_open()
シェルコマンドを呼び出すために利用した関数を使用していました。STDIO のやり方が間違っていたようで、PHP やターゲット コマンドがロックされることがありました。これは元のコードです:
ほとんどの場合は機能しますが、それだけでは十分ではなく、常に機能するようにしたいと考えています。
この問題はstream_get_contents()
、STDIO バッファが 4k のデータを超える場合にロックアップすることにあります。
テストケース
STDERR と STDOUT に、合わせて 4120 バイト (4k を超える) の文字列を 2 回出力します。これにより、PHP が両側でロックアップします。
解決
どうやら、stream_select()
行く方法です。次のコードがあります。
パズルの唯一の残りのピースは、STDIN の処理です ( の行を参照(???)
)。
STDIN は、自分の関数を呼び出しているものによって提供される必要があることがわかりましたexecute()
。しかし、STDIN をまったく使用したくない場合はどうすればよいでしょうか。上記のテストケースでは、入力を求めませんでしたが、STDIN に対して何かを行うことになっています。
とはいえ、上記のアプローチは依然として でフリーズしstream_get_contents()
ます。私は何をすべきか/次に何をしようとしているのかよくわかりません.
クレジット
解決策は、元の問題を発見しただけでなく、Jakob Truelsen によって提案されました。4kのヒントも彼のアイデアでした。これに先立って、関数が正常に動作する理由について困惑していました (すべてがバッファ サイズに依存していることを知りませんでした)。