요청 처리를 받은 후 WeChat 인터페이스를 요청하고 많은 주문을 처리하고 WeChat 인터페이스를 호출해야 하는 매우 시간이 많이 걸리는 작업이 있었습니다. 에코 후에 이러한 작업을 수행하고 싶습니다. 메시지큐는 서버에 memcacheq 등의 확장 기능을 설치해야 합니다. 서버를 운영할 권한이 없어서 코드로 해결하고 싶습니다. 메시지 대기열을 구현하는 것이 가능합니까? 대기열 작업에 대해 아무것도 모르는 사람이 있습니까? fsockopen을 사용하여 구현할 수도 있다는 것을 보았습니다. 이것과 메시지 대기열 메커니즘의 차이점은 무엇입니까?
요청 처리를 받은 후 WeChat 인터페이스를 요청하고 많은 주문을 처리하고 WeChat 인터페이스를 호출해야 하는 매우 시간이 많이 걸리는 작업이 있었습니다. 에코 후에 이러한 작업을 수행하고 싶습니다. 메시지큐는 서버에 memcacheq 등의 확장 기능을 설치해야 합니다. 서버를 운영할 권한이 없어서 코드로 해결하고 싶습니다. 메시지 대기열을 구현하는 것이 가능합니까? 대기열 작업에 대해 아무것도 모르는 사람이 있습니까? fsockopen을 사용하여 구현할 수도 있다는 것을 보았습니다. 이것과 메시지 대기열 메커니즘의 차이점은 무엇입니까?
<code>//程序被阻塞10秒 shell_exec('timeout 10 vmstat 1 >/dev/null 2>&1 &'); //程序不会被阻塞 pclose(popen('timeout 10 vmstat 1 >/dev/null 2>&1 &', 'r')); //因此可以异步执行任务 pclose(popen("timeout 60 php /path/to/task.php '$arg' >/dev/null 2>&1 &", 'r')); </code>
$arg 변수는 task.php 스크립트에 전달되는 매개변수입니다. 이 매개변수는 task.php의 $argv[1]을 통해 얻습니다.
timeout 60은 task.php 스크립트의 최대 실행 시간을 의미합니다. 60초 필요하면 제거할 수 있습니다.
비동기 구현을 위한 pclose(popen())의 핵심은 차단 코드를 실행하는 프로세스를 여는 것입니다.
자동이 필요하지 않은 비동기 시나리오에 적합합니다. 실행 완료 후 결과(콜백) 반환
문자열 매개변수 $arg를 작은따옴표로 묶을 수 있어 일부 공백의 영향을 피할 수 있지만 여전히 결함이 있습니다.
(SQL 주입과 비교하여) Shell 주입을 피하려면 다음을 수행하는 것이 가장 좋습니다. 문자열 매개변수를 파일
으로 직렬화한 다음 파일 경로 매개변수를 task.php 스크립트에 전달하고 task.php가 파일을 읽고 데이터를 직렬화 해제, 역직렬화 및 가져오도록 합니다.
파일 이름은 고유해야 합니다. , 예를 들어 사용자 ID + 프로세스 PID + 임의 시간 번호:
<code>$filename = md5(uniqid($uid.'_'.getmypid().'_'.mt_rand().'_', true)); </code>
PHP-FPM에서 제공하는 fastcgi_finish_request
함수는 클라이언트에 대한 모든 응답 데이터를 플러시하고 요청을 종료할 수 있습니다. 이를 통해 클라이언트는 연결이 종료된 후에도 사용자에게 출력할 필요가 없는 코드를 계속 실행할 수 있습니다. 캐시를 생성하는 것과 같지만 여전히 현재 FPM 작업자 프로세스를 차단합니다.
http://php.net/manual/zh/func...
fsockopen은 요청을 발행하지만(curl과 유사) 결과가 반환될 때까지 기다리지 않음을 의미합니다.
따라서 fsockopen을 사용할 수도 있습니다. 에코 후 fsockopen은 WeChat 인터페이스의 로컬 작업을 요청합니다.