0

リモート サーバーで作業していますが、ssh が有効になっていないため、コンソールを使用できません。したがって、aco_sync をブラウザーから (またはシェルを使用しない他の方法で) 直接実行する必要があります。

コントローラー/アクションで次のコードを使用して、ローカルの開発サーバーで acos を同期することができました。

$command = ROOT . DS . APP_DIR . DS . 'Console' . DS . 'cake';
$params = ' -app ' . ROOT . DS . APP_DIR;
$params .= ' AclExtras.AclExtras';
$params .= ' aco_sync';
$result = shell_exec($command . $params);

しかし、実稼働サーバー (cPanel を使用) では、約 5 分間応答がなく、内部サーバー エラー (500) が発生します。私はただぶら下がっています。実際、これは cPanel を使用する 2 つの異なる VPS サーバーで発生しました。最初のものでは、ssh があり、コンソールからコマンドを実行できました。しかし、引用されたコードをブラウザーから実行すると、他のサーバーと同じようにハングしました。

  • PHPログファイルにもケーキのログファイルにも、ログに記録されたエラーは見つかりませんでした。
  • アクションには「admin_」というプレフィックスが付けられ、ログインしていない場合、ACL は実行を許可しません。「./cake」スクリプト ファイルには実行権限があります (これが必要であることを理解するのにしばらく時間がかかりました)。
  • ChromeとIE8で試しました。
  • デバッグ レベルは 1 に設定されました。
  • スクリプトを実行しようとすると、ページが壊れてしまい、シークレット ウィンドウを開くかブラウザを再起動するまで閲覧できませんでした。
  • このスクリプトを実行すると、サーバーのメモリが完全に消費されると思います。制御できるサーバーでサイトを再起動して実行するには、httpd を再起動する必要がありました。

私は $dispatcher->dispatch() を使ったいくつかの実装を見て、それらをたくさん試しましたが、うまくいきませんでした。

何か案は?

4

2 に答える 2

5
App::uses('ShellDispatcher', 'Console');
$command = '-app '.APP.' AclExtras.AclExtras aco_sync';
$args = explode(' ', $command);
$dispatcher = new ShellDispatcher($args, false);
if($dispatcher->dispatch()) {
    echo 'OK';
} else {
    echo 'Error';
}
于 2013-02-22T15:35:54.150 に答える