CakePHP 2.2 AclExtras浏览器中的aco_sync(sh权限被拒绝)

时间:2013-01-24 05:05:14

标签: cakephp acl cakephp-2.2

我正在远程服务器上工作而我无法使用控制台,因为未启用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也不允许执行。 ' ./饼'脚本文件具有执行权限(花了一些时间来确定这是必要的)。
  • 我尝试使用Chrome和IE8。
  • 调试级别设置为1。
  • 尝试运行脚本后,页面出现故障,我无法浏览,直到我打开隐身窗口或重新启动浏览器。
  • 我认为运行此脚本时服务器的内存会被完全消耗掉。我必须重新启动httpd才能在我可以控制的服务器上重新启动并运行该站点。

我已经看过一些使用$ dispatcher-> dispatch()的实现,并尝试了一堆但没有运气。

有什么想法吗?

2 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分: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);
    }