从php调用时使python脚本运行线程化

时间:2018-08-08 13:16:53

标签: php python python-2.7

我有一个PHP网页,该网页对数据库进行多个查询并在图表上显示结果。

逻辑是存在index.php,可以在其中进行查询。提交数据后,将调用6个不同的PHP页面。 PHP页面记录查询,运行适当的Python脚本并使用Javascript制作图表。这6个PHP页面中的每一个都显示在 divs 中的index.php中。所有python脚本都具有相同的输入,并针对相同的数据库进行查询。差异来自从数据库中提取的数据,以及随后的用于制作图表的Javascript。

调用其中一个PHP页面的示例:

$("#chartFOO").load("http://example/test/get_foo.php? bar=".concat(bar)+"&start=".concat(start)+"&end=".concat(end), function(responseTxt, statusTxt, xhr){
    if(statusTxt == "error")
        alert("Error: " + xhr.status + ": " + xhr.statusText);
});

调用Python脚本的示例:

if ($msisdn) {
    $command = escapeshellcmd("/home/example/scripts/graph_foo.py $bar $start $end");
    $output = shell_exec($command);
}

然后将输出用于PHP文件中以制作图表。所有的PHP文件都以 divs 的形式显示在index.php上。

问题是,它不会在多个线程上运行它们并锁定了系统,这使查询的响应时间很慢。是这样,一次只能运行一个shell命令吗?!

我尝试将所有Python脚本作为函数,将6个PHP文件作为字符串放在一个文件中。试图用一个命令调用所有命令,但是到目前为止,我在格式化PHP文件时遇到问题,我无法使用'{}'进行格式化,因为PHP文件已经包含了这些文件。有想法使用线程模块,运行功能。并使用一个连接到数据库,以节省6次连接的时间,因为每次都需要花费时间。

是否有合理的解决方案来使脚本运行线程化,而不必重新整理整个网页?如何将PHP,Javascript和Python混合使用?

要阅读的东西很多,要问的很多,但是感谢您的宝贵时间。

编辑:

我创建了一个新文件,其中基本上包含所有6个文件。但是现在调用Python脚本有些不同。从index.php仅现在调用此一个文件,就像我之前对6个文件所做的那样。

新方法示例:

$part->handles = [
    popen("/home/example/scripts/graph_foo.py {$bar} {$start} {$end}", 'r'),
    popen("/home/example/scripts/graph_foo2.py {$bar} {$start} {$end}", 'r')
];

解决内存问题的方法:

$output0 = '';
while (!feof($part->handles[0])) {
    $output0 .= fread($part->handles[0], 32768);
}
$output1 = '';
while (!feof($part->handles[1])) {
    $output1 .= fread($part->handles[1], 32768);
}

不知道最好的方法,但是可以。不太了解PHP。但这确实使请求时间减少了0.5分钟,这很有帮助。

0 个答案:

没有答案