0

我在远程服务器上工作,我无法使用控制台,因为 ssh 未启用。所以我需要直接从浏览器运行 aco_sync (或任何其他不涉及 shell 的方式)。

我设法在我的本地开发服务器上使用控制器/操作中的以下代码同步 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 的不同 VPS 服务器上。在第一个中,我有 ssh 并且能够从控制台运行命令。但是当从浏览器运行引用的代码时,我就像另一台服务器一样挂起。

  • 我在 php 日志文件和 cake 的日志文件中都没有发现任何记录错误。
  • 该操作以“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 回答
0

试试这个, $dispatcher->dispatch(); 似乎仅在出现错误时才显示某些内容。运行它并检查您的数据库。

    App::uses('ShellDispatcher', 'Console');
    $command = '-app '.APP.' AclExtras.AclExtras aco_sync';
    $args = explode(' ', $command);
    $dispatcher = new ShellDispatcher($args, false);

    try {
        $dispatcher->dispatch();
    } catch (Exception $e) {
        pr($e);
    }
于 2017-06-15T05:05:38.010 回答