/ Web安全

如何在php中调用python

0x01 Gearman

php现在在web开发中由于其简单易用而受到青睐,python作为一门优秀的语言在众多领域发挥其重要作用,尤其是在数据处理和机器学习领域,为了能够实现一款基于机器学习的waf,并且能够不通过离线操作实现数据分析,能够使这两门语言间直接通信是后续的基础。

Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上。gearman跨语言跨平台,很方便的实现异步后台任务。通过一张图来理解
调度模型

0x02 安装Gearman

apt-get install gearman-job-serve

安装php gearman扩展
apt-get install php-gearman

安装python gearman库
pip install gaerman

检测是否安装成功
php 0--info | grep "gearman"
显示gearman support => enabled

pip list | grep gearman

0x03 尝试写点代码

client.php

<?php

$client = new GearmanClient();
$client->addServer('127.0.0.1', 4730);
$who = array("who_send"=>"php","get_mail"=>"this is a test");
print $client->do("sendEmail",json_encode($who));
print "\n";

worker.py

#!/usr/bin/env python
# coding=utf-8
import os
import json
import gearman
import math

class CustomanWorker(gearman.GearmanWorker):
    def on_job_execute(self, current_job):
        return super(CustomanWorker, self).on_job_execute(current_job)
    
def doSendEmail(gearman_work, job):
    print job.data
    print json.loads(job.data)
    return "python receive %s" % job.data


new_worker = CustomanWorker(['localhost:4730'])
new_worker.register_task("sendEmail", doSendEmail)
new_worker.work()

在终端中先运行worker.py这时,worker.py会处于阻塞状态,等待任务调度的到来,再另一终端运行client.php,会看到打印输出
php调用python执行效果