複数の PHP バージョンがインストールされている共有ホスト上のバックグラウンド スクリプト
-
22-09-2019 - |
質問
画像管理スクリプトのサムネイルを (PHP5 を使用して) 生成する方法が必要でしたが、ホストに複数のバージョンの PHP (4 と 5) がインストールされており、PHP4 がデフォルトとして設定されているという問題が発生しました。これは、CLI から php を呼び出すと PHP4 が実行されることを意味します。クロスプラットフォームのソリューションとして期待しているものとして、次のことを思いつきました。私は主に、Google を使用してヘルプを見つけるのに非常に苦労したため、ここに投稿しています。これは将来誰かに役立つかもしれません。また、次の質問もあります。
- 明らかに間違っている点はありますか?
- 他に php5 バイナリへのパスがあり、または配列を最適化するためのより良い順序を知っているものはありますか?
- ホストで exec またはshell_exec が無効になっている場合、EGalleryProcessQueue.php スクリプトをスタンドアロン cron ジョブとして実行できますか?これをテストするための cron へのアクセス権がまだありません。いずれにしても最終的にはテストする予定なので、この質問についてはあまり心配していません。
- 画像の処理がどの程度進んでいるのかについてフィードバックを得る方法について何か提案はありますか?EGalleryProcessQueue.php の TODO セクションを参照してください。管理セクションにあるときに進行状況バーを表示したいと考えています。
メインスクリプト
/**
* Writes the array to a text file in /path/to/gallery/needsThumbs.txt for batch processing.
* Runs the thumbnail generator script in the background.
*
* @param array $_needsThumbs the array of images needing thumbnails
*/
private function generateThumbnails($_needsThumbs)
{
file_put_contents($this->_realpath.DIRECTORY_SEPARATOR.'needsThumbs.txt',serialize($_needsThumbs));
$Command = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'EGalleryProcessQueue.php '.$this->_realpath.' '.$this->thumbnailWidth.' '.$this->thumbnailHeight;
if(PHP_SHLIB_SUFFIX == 'so')// *nix (aka NOT windows)
{
/*
* We need to make sure we are using the right PHP version
* (problems with shared hosts that have PHP4 and PHP5 installed,
* but PHP4 set as default).
*/
$phpPaths = array('php', '/usr/local/bin/php', '/usr/local/php5/bin/php', '/usr/bin/php', '/usr/bin/php5');
foreach($phpPaths as $path)
{
exec("echo '<?php echo version_compare(PHP_VERSION, \"5.0.0\", \">=\"); ?>' | $path", $result);
if($result)
{
shell_exec("nohup $path $Command 2> /dev/null > /dev/null &");
break;
}
}
}
else // Windows
{
$WshShell = new COM("WScript.Shell");
$WshShell->Run("php.exe $Command", 0, false);
}
}
Eギャラリープロセスキュー.php
#!/usr/bin/php
<?php
if ($argc === 4 && strstr($argv[0], basename(__FILE__))) {
// File is being called by the CLI and has not been included by another script
if(!file_exists($argv[1].DIRECTORY_SEPARATOR.'needsThumbs.txt'))
{
// Either no thumbnails need to be created or a wrong directory has been supplied
exit;
}
include(realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'EGalleryThumbGenerator.php');
$generator = new EGalleryThumbGenerator;
$generator->directory = $argv[1];
$generator->thumbnailWidth = is_int($argv[2]) ? $argv[2] : 128;
$generator->thumbnailHeight = is_int($argv[3]) ? $argv[3] : 128;
// $generator->processImages() returns the number of images left to process (it does them in blocks of 10)
while (($i = $generator->processImages()) > 0)
{
/*
* TODO Can we get some sort of feedback to the user here?
* Possibly so that we can display a progress bar in the management section.
* Probably have to write $i to a file to be read by the main script.
*/
}
exit;
}
?>
解決
あなたはそれを明らかに間違っ何も見えていますか?
いいえ、コードのルックスのいいます。
PHPはどこかのサーバー上にインストールすることができて、あなたが知っているか、最適化のための配列を持っているより良いための知っていることのphp5バイナリへの他のパスはありますか?
これは、答えに難しい質問です。あなたが持っているパスは、私にとって非常に論理的であるように見えるが、それをインストールすることができ、他の場所の任意の数がある可能性があります。
PHP5がインストールされる可能性がありますディレクトリの束を提供するのではなくは、パラメータを持っていることについて、ユーザーはそれが彼らの$ PATHにない場合はPHP5の実行ファイルへのパスを提供するために、セットに何がある?
ホストが無効のexecまたはもしくはshell_execがある場合は、は、EGalleryProcessQueue.phpスクリプトはcronジョブを経て実行されることができるのだろうか?
私はそれをテストしていませんが、私はそれが実行してからスクリプトを妨げると仮定します。
んの誰もが、私は処理がどのくらい離れているかスルー画像へといくつかのフィードバックを得ることができる方法についてどのような提案がありますか? EGalleryProcessQueue.php IのTODOセクションを参照してください、それは管理セクションにあります時にプログレスバーを表示したいと思います。
店のどこかで(ファイル、DB、多分セッションVAR)を完了し、毎秒かそこらの合計対行わ提供機能へのAJAX呼び出しの火を持っている画像の数。その後、 http://docs.jquery.com/UI/Progressbarする