从PHP控制器调用带有request.post()的python脚本永远不会返回。为什么?

从PHP控制器调用带有request.post()的python脚本永远不会返回。为什么?,python,php,ajax,symfony,python-requests,Python,Php,Ajax,Symfony,Python Requests,我正在尝试从Laravel8应用程序执行python脚本。python脚本使用Laravel应用程序的RESTAPI,因此它必须进行身份验证 如果python脚本在命令行(开发平台是Windows 10)上运行,它本身运行得很好,但是如果通过shell_exec()或exec()或symfony/process()运行,它会关闭Laravel应用程序,直到我需要在另一个端口上重新启动应用程序,或者在控制台、Laravel日志中没有错误地重新启动 如果我从python脚本中取出'requests.

我正在尝试从Laravel8应用程序执行python脚本。python脚本使用Laravel应用程序的RESTAPI,因此它必须进行身份验证

如果python脚本在命令行(开发平台是Windows 10)上运行,它本身运行得很好,但是如果通过shell_exec()或exec()或symfony/process()运行,它会关闭Laravel应用程序,直到我需要在另一个端口上重新启动应用程序,或者在控制台、Laravel日志中没有错误地重新启动

如果我从python脚本中取出'requests.post()'并将其替换为print(“helloworld”),那么shell_exec()就可以正常工作

问题:有人看到可能发生的事情吗?这似乎是权限问题,但我不确定

脚注:我尝试了Symfony,但得到了一个错误,许多其他人报告说“无法获取随机数来初始化Python运行时”。这似乎是windows开发环境中的常见问题。解决了这个问题,但结果是一样的。对于将来看到此python初始化错误的任何人:在windows构建环境中,需要按如下方式添加环境变量SystemRoot:
$process=new process([$python,$process\u path,$argument1,$argument2],null,['SystemRoot'=>'C:\windows'])

控制器

    public function startprocess(Request $request)
    {

        $python = "C:/Users/dev/AppData/Local/Programs/Python/Python38/python.exe";
        $process_path = "C:/Apache24/htdocs/project/resources/python/lambda/test.py";
        $complete_path = $python." ".$process_path;
        $output = [];
        $return_var = "";

//        exec($complete_path, $output, $return_var);
        $process = new Process([$python, $process_path], null, ['SystemRoot' => 'C:\WINDOWS']);
        $process->run();

        return view('admin.scheduledtasks_data', compact('output', 'return_var', 'complete_path'))->render();
    }
Python代码

import sys
import requests
from requests.exceptions import HTTPError
import re

url_login = 'http://127.0.0.1:8089/api/apilogin'

data = {
    'email': 'myemail@email.com',
    'password': 'password'}

returned_data = requests.post(url_login, data=data)  #<<THIS TAKES DOWN THE SERVER
send: b'POST /api/apilogin HTTP/1.1 
Host: 127.0.0.1:8098 
User-Agent: python-requests/2.23.0 
Accept-Encoding: gzip, deflate 
Accept: */* 
Connection: keep-alive 
Content-Length: 48 
Content-Type: application/x-www-form-urlencoded'
send: b'email= (deleted) &password= (deleted)'
reply: 'HTTP/1.1 201 Created'
header: Host: 127.0.0.1:8098
header: Date: Fri, 13 Nov 2020 19:07:10 GMT
header: Connection: close
header: X-Powered-By: PHP/7.4.2
header: Cache-Control: no-cache, private
header: Date: Fri, 13 Nov 2020 19:07:10 GMT
header: Content-Type: application/json
header: X-RateLimit-Limit: 60
header: X-RateLimit-Remaining: 59
下面是从命令行发出的好请求

import sys
import requests
from requests.exceptions import HTTPError
import re

url_login = 'http://127.0.0.1:8089/api/apilogin'

data = {
    'email': 'myemail@email.com',
    'password': 'password'}

returned_data = requests.post(url_login, data=data)  #<<THIS TAKES DOWN THE SERVER
send: b'POST /api/apilogin HTTP/1.1 
Host: 127.0.0.1:8098 
User-Agent: python-requests/2.23.0 
Accept-Encoding: gzip, deflate 
Accept: */* 
Connection: keep-alive 
Content-Length: 48 
Content-Type: application/x-www-form-urlencoded'
send: b'email= (deleted) &password= (deleted)'
reply: 'HTTP/1.1 201 Created'
header: Host: 127.0.0.1:8098
header: Date: Fri, 13 Nov 2020 19:07:10 GMT
header: Connection: close
header: X-Powered-By: PHP/7.4.2
header: Cache-Control: no-cache, private
header: Date: Fri, 13 Nov 2020 19:07:10 GMT
header: Content-Type: application/json
header: X-RateLimit-Limit: 60
header: X-RateLimit-Remaining: 59
下面是我使用requests.post(url\u login,data=data,timeout=3)从laravel应用程序调用它时的响应,添加了“timeout”,但从未发生登录。如果没有超时,请求将永远不会返回,服务器将停机

HTTP/1.1 200 OK
Host: 127.0.0.1:8102
Date: Fri, 13 Nov 2020 23:05:38 GMT
Connection: close
X-Powered-By: PHP/7.4.2
Content-Type: text/html; charset=UTF-8
Cache-Control: no-cache, private
Date: Fri, 13 Nov 2020 23:05:38 GMT
Set-Cookie: XSRF-TOKEN= (deleted); 
    expires=Sat, 14-Nov-2020 01:05:38 GMT; 
    Max-Age=7200; 
    path=/
Set-Cookie: icollect_session=(deleted); 
    expires=Sat, 14-Nov-2020 01:05:38 GMT; 
    Max-Age=7200; 
    path=/; 
    httponly
<td>
<textarea class="form-control" id="FormControlTextarea" rows="10" cols="300">
send: b&#039;POST /api/apilogin HTTP/1.1\r\n
Host: 127.0.0.1:8102\r\n
User-Agent: python-requests/2.23.0\r\n
Accept-Encoding: gzip, deflate\r\n
Accept: */*\r\n
Connection: keep-alive\r\n
Content-Length: 48\r\n
Content-Type: application/x-www-form-urlencoded\r\n\r\n&#039;
send: b&#039;email=(deleted)&amp;password=(deleted);
</textarea>
</td>
去掉Symfony process()并改为此。发生的情况是laravel应用程序阻止了request.post的完成,因此服务器被锁定

--多谢各位

function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r")); 
    }
    else {
        exec($cmd . " > /dev/null &");  
    }
}