在PHP程序中异步调用python文件

直接通过exec()这类函数调用python文件的话 如下:

exec('python D:/PycharmProjects/test.py 参数');

接口会卡住半天(即:需要等待python程序运行完毕,接口才会正常响应),
所以需要异步执行python程序

即:接口数据直接返回, 而python程序在后台运行

可以使用popen() 函数创建了一个进程来运行一个 Python 脚本,并且利用 pclose() 函数来关闭这个进程

下面附上PHP接口函数中的示例代码:

public function index(){
    $param = request()->post();

    if (empty($param)){
        $res = [
            'code' => -1,
            'message' => 'error',
        ];
        return json($res);
    }

    /***

     * 业务逻辑代码

     ***/
    $falg = true;

    if ($falg){
        
        // 调用python
        $python_path = 'F:\pythonProject\venv\Scripts\python.exe';
        $file_path = 'F:\pythonProject\test.py';
        // 异步执行 Python 程序
        pclose(popen("start {$python_path} {$file_path} {$param}",'r'));

        $res = [
            'code' => 0,
            'message' => 'success',
        ];
    }else{
        $res = [
            'code' => -1,
            'message' => 'error',
        ];
    }
    return json($res);
}

python文件部分代码:

import sys
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

def pp(data):
    option = webdriver.ChromeOptions()
    # option.add_argument("headless")
    driver = webdriver.Chrome(options=option)
    driver.get(data)

    driver.find_element(By.ID, "kw").send_keys("猫")
    driver.find_element(By.XPATH, '//*[@id="homeSearchForm"]/span[2]/input').click()
    print("控制台输出: ", data)
    
    # 为测试是否可以异步执行设置延迟5s
    sleep(5)

    driver.quit()


if __name__ == '__main__':
    if len(sys.argv) > 1:
        pp(sys.argv[1])

实测可以实现所需功能!

这里贴出chatgpt对于这行代码的解释

pclose(popen("start {$python_path} {$file_path} {$param}",'r'));

这段 PHP 代码的作用是在 Windows 操作系统上异步执行 test.php 脚本,即不等待 test.php 执行完成,而是立即返回。

解释一下代码:

popen() 函数打开一个进程,并返回一个进程标识符(文件指针)。
在 popen() 函数的第二个参数中,我们使用 “start php.exe test.php” 命令来启动 PHP 解释器并运行 test.php。
“r” 参数告诉 popen() 函数以只读方式打开管道。
pclose() 函数关闭由 popen() 打开的管道。
由于 popen() 函数会返回一个进程标识符,我们可以传递该标识符给 pclose() 函数,以便在后台自动关闭进程。

风影OvO

风影OvO, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA 4.0协议进行授权 | 转载请注明原文链接

4 Comments

  • 虽然看不懂,但是感觉很牛

  • NB啊

  • 试了一下,很管用,跟楼主的使用场景几乎一样哈!特地来留言感谢一下

    另外python外部传参,我参考了此文:https://blog.csdn.net/weixin_38037405/article/details/126257310

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐