通过命令行执行用 ZendGuard 编码的 PHP 脚本

Posted

技术标签:

【中文标题】通过命令行执行用 ZendGuard 编码的 PHP 脚本【英文标题】:Execute PHP script encoded with ZendGuard through command line 【发布时间】:2014-05-24 13:21:54 【问题描述】:

我需要从命令行 (php CLI) 运行一些由 Zend Guard 加密的文件,而 php 似乎在到达编码文件时立即退出,没有任何错误消息。是否可以从命令行执行 Zend Guard 编码的 PHP 脚本?

更多详情

在我目前正在处理的应用程序中,一些任务需要定期运行。起初,我们为一些仅用于运行任务的 url 实现了控制器。然后我们将在这些页面上使用wget 执行一项cron 工作。问题是其中一些任务需要参数才能运行。使用wget 执行 POST 请求不起作用,因为 Zend Guard 所做的第一件事是分配一个 cookie,然后重定向到相同的 URL。在第二个请求中,由于它现在在 GET 中,所以所有参数都丢失了。

然后我们决定使用命令行脚本来解决问题。我们非常喜欢这种方法,因为它解决了我们在使用基于 URL 的方法时遇到的问题。首先,它不会长时间保持打开的 Apache 连接。此外,它不会在公共 URL 上公开一些内部逻辑。正如我之前所说,当我们尝试执行这些命令行脚本时,什么也没有发生,应用程序只是退出了。

我们使用的是 Ubuntu 12.04 LTS、PHP 5.4.25 和 Apache 2.2.22。我确保在命令行中正确加载了 Zend Guard 扩展。此外,当网页被网络浏览器访问时,它也能正常工作。

如果有人能帮我解决这个问题,将不胜感激。谢谢!

【问题讨论】:

您的日志中有关于失败的任何信息吗?您是否尝试过提高日志级别? 您在哪里包含了您的 zend 保护模块?您能否详细说明在哪些目录中启用了 zend 保护模块的方式和文件? 编写一个curls 脚本的小型 PHP 脚本怎么样?首先curl 打开连接,获取cookie 并被重定向。第二个 curl 执行 POST 请求并发送 cookie。没有第二种方法的优势,但我认为它会起作用。 【参考方案1】:

我在这里做一个假设。当你们将脚本移动到从命令行运行时,实际上并没有重新编写脚本。您只需对文件执行 php -f 而不是对 URL 执行 wget

如果是这种情况,您可能在脚本中有一些逻辑需要身份验证或 Web 服务器逻辑,如果未找到参数,则带有退出/死亡。您提到某些脚本需要 POST 才能运行,所以我的猜测是那里有一个 $_POST 显然无法在命令行上运行。

只是猜测。

编辑:当您通过 URL 访问时,只需阅读您所说的有效部分即可。几乎肯定是 $_POST 或类似的东西。

【讨论】:

【参考方案2】:

你应该把你想从命令行运行的任何逻辑包装在你的php脚本里面

$cli = isset($_ENV['SSH_CLIENT']);
if($cli) 
  // Code to run from command line here

 else 
  // Code for the Web here



这将允许您从 Web 和命令行运行相同的文件。正如tazer84 提到的——确保在 CLI 模式下,您不包含 Web Only 逻辑(例如 header('location: ...');$_COOKIE$_POST 等),反之亦然反面。

【讨论】:

以上是关于通过命令行执行用 ZendGuard 编码的 PHP 脚本的主要内容,如果未能解决你的问题,请参考以下文章

编码用命令行执行的C语言词语统计程序

编码用命令行执行的C语言词语统计程序

编码用命令执行的C语言词语统计程序

如何查看二进制格式的 zend 编码文件?

mysql命令行导入sql脚本中文变问号问题

如何使用 Zend Guard 加载器识别 PHP 文件是不是已编码