PHPライブラリまたはコマンドライン?
-
19-08-2019 - |
質問
最近、PHPライブラリではなくコマンドラインを使用して何かを行うことにした2つの状況に遭遇しました。たとえば、PHPでこれを行う場合:
`curl http://someplace.com`
これの代わりに:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch);
もう1つの状況は、PHPインターフェースではなく、ImageMagickのコマンドラインインターフェースを使用していることです。
私が話した人の中には、ライブラリを使う方が良いと思う人もいます。より良いと言う人はより速いと言う人もいれば、より安全だと言う人もいます。
あなたの意見は?一方を他方より使用する利点は何ですか?
1つの利点を知っています。5行ではなく1行のコードしかありません。
解決
常にライブラリを使用します:
-
2回フォークする必要はありません(サブシェル用に1回、実行中のプログラム用に1回)-したがって、より高速です
-
コマンドライン引数のエスケープについて心配する必要はありません。これはセキュリティに役立ちます
コードの行数が心配な場合は、これらの5行を関数に1回書き込み、必要なときにその関数を呼び出します。
他のヒント
アプリケーションの実行は、潜在的に危険であり、ほとんど常にコストのかかる操作です。とりわけ、プログラムに渡すすべてのパラメーターを適切にエスケープする必要があります。
新しいプロセスを作成するコストは、既存のプロセスで単純な関数を呼び出すよりもはるかに高くなります。
今やっていることはうまくいくかもしれませんが、アプリケーションに数千の同時ユーザーがいるとうまくいきません。 (あなたはそれを計画していますよね:))
コマンドラインコールの使用とライブラリの使用のトレードオフは、アプリケーションの速度と、アプリケーションを実行しているコンピューターの速度です。
そのようなコマンドライン呼び出しを行うたびに、PHPはプロセス(実際には2つのシェル、次に実行するコマンド)をフォークする必要があります。つまり、コンピューターは別のアプリケーションを起動する必要があります。これは多くのシステムリソースを消費する高価なものです。コンピューター(または起動プロセス)がコンピューター上で一度に多くのプログラムを起動しようとするとどうなるかを考えてください。
ライブラリを使用する場合、プロセスをフォークする必要はありません。 PHP自体は、他のアプリケーションが行う作業を実行しています。
そうは言っても、PHPライブラリ経由では利用できないコマンドラインアプリケーションを呼び出すことで逃れる多くの実稼働Webアプリケーションを知っています。アプリケーションのトラフィックの少ない部分、またはそれほど頻繁にヒットしないページの場合、それで逃げることができるかもしれませんが、スケールする時が来たら自分自身を傷つけてしまいます。
考慮すべきセキュリティもあります。そのようなPHPからコマンドを実行するときに、変数を使用してコマンド文字列を作成する場合、次のようなリスクがあります
;rm -rf /
コマンドに挿入されますが、これは悪いことです(rm -rf /はファイルシステム全体を削除します)。はい、これを処理するために入力変数をエスケープできますが、ベテランのPHP開発者には、SQLクエリをどのようにエスケープするかを尋ねてください。
つまり、簡単に言うと、おそらくそれで十分ですが、ベストプラクティスではなく、将来的にファンがヒットしたときに自分自身の痛みを買うことになります。