繁体   English   中英

如何在不使用PHP exec或shell_exec的情况下运行CasperJS脚本

[英]How to run CasperJS script without using PHP exec or shell_exec

我有一个CasperJS脚本,其中的结果需要用PHP捕获。 为此,我不得不使用PHP的exec()shell_exec()函数。 但是最近我才知道在服务器上启用命令行执行是有风险的,而且并不安全。 那么,如何在不使用PHP中的任何一个函数的情况下运行CasperJS脚本呢?

PS :更准确地说,如何在Web浏览器上使用CasperJS,例如使用PHP处理Web表单并返回从CasperJS派生的输出,而无需触摸exec或shell_exec来执行它。

CasperJS基于PhantomJS(或SlimerJS)构建。 它可以使用PhantomJS提供的所有功能,包括Web服务器模块 这个想法是运行一个CasperJS实例,您的PHP脚本可以通过HTTP查询该实例。

您可以在系统启动时或通过cron作业(并在崩溃时重新启动)来启动CasperJS脚本。 然后,您可以通过本地http请求对其进行查询。

CasperJS脚本:

var webserver = require('webserver');
var server = webserver.create();
var service = server.listen(8080, function(request, response) {
    var casper = require('casper').create({
        exitOnError: false,
        onError: function(msg, backtrace){
            response.statusCode = 500;
            response.write('ERROR: ' + msg + "\n" + JSON.stringify(backtrace));
            response.close();
        }
    });

    casper.start(yourURL, function(){
        // TODO: do something
        response.statusCode = 200;
        response.write('something');
        response.close();
    }).run(function(){
        // this function is necessary to prevent exiting the whole script
    });
});

然后在PHP中,您可以使用诸如file_get_contents()来检索响应:

$result = file_get_contents("http://localhost:8080/");

要注意的事情:

  • 以无法从外部访问运行PhantomJS的端口的方式配置计算机。
  • 如果您使用的是cron作业方法,请编写一个pid文件以确保不启动另一个实例。
  • Web服务器模块仅支持10个并发请求。 如果您的系统超出了这些范围,则需要创建一个由多个CasperJS(PhantomJS)进程组成的池。
  • 就像在任何普通浏览器中一样,单个CasperJS(PhantomJS)进程的页面都共享同一会话。 如果要彼此隔离,则需要为每个请求运行一个CasperJS(PhantomJS)进程。

您进行通常的小方块舞。

  1. 运行您的PHP程序,捕获输入,生成作业配置。
  2. 将该工作放在您的数据库中,然后使用CRON进行处理。
  3. 使用任何方法进行处理 ,将结果放入不同的数据库表或文件系统中。
  4. 将您的工作标记为“完成”,以便面向用户的PHP可以定期轮询该状态,并在完成时向用户提供最终结果。

如果您这样做是因为您知道exec()在您的应用程序中暴露了什么攻击向量,并且不能忍受该攻击向量-没关系。

但是,如果您因为害怕“甚至不确定”而这样做,那就不要。 您会变得更糟。

祝好运。
:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM