>백엔드 개발 >PHP 튜토리얼 >비동기 프로그래밍 - PHP는 어떻게 코드를 비동기적으로 실행합니까?

비동기 프로그래밍 - PHP는 어떻게 코드를 비동기적으로 실행합니까?

WBOY
WBOY원래의
2016-08-08 09:06:531334검색

예를 들어 일부 로그 데이터를 기록하고 싶다면 코드가 비동기적으로 실행된 후 즉시 다음 코드를 실행하고 싶습니다. 콜백 처리도 필요하지 않습니다. . 데이터를 메시지 큐로 보내면 시간이 걸립니다. 음, 데이터를 누구에게 전달하는지에 대해서는 밀리초 단위로 계속 진행하고 싶습니다. 예를 들어
echo 1;
log(data) ;
echo 2;
로그 기능이 백그라운드에서 실행되기를 원합니다. 상관은 없지만 기다릴 필요는 없습니다. 제 생각에는 밀리초 안에 완료되는 것 같습니다.

답글 내용:

예를 들어 일부 로그 데이터를 기록하고 싶다면 코드가 비동기적으로 실행된 후 즉시 다음 코드를 실행하고 싶습니다. 콜백 처리도 필요하지 않습니다. . 데이터를 메시지 큐로 보내면 시간이 걸릴 것입니다. 다음 코드를 밀리초 단위로 계속하고 싶습니다. 데이터를 전달하는 데 시간이 얼마나 걸리는지는 상관하지 않습니다. 예를 들어
echo 1;
log(data) ;
echo 2;
로그 기능이 백그라운드에서 실행되기를 원합니다. 상관은 없지만 기다릴 필요는 없습니다. 제 생각에는 밀리초 안에 완료되는 것 같습니다.

메시지 큐로 보내기 VS 밀리초 수준 >>> 모순은 어디에 있습니까?

Redis를 사용하여 대기열을 만들 수 있습니다. Redis 작업은 초당 수만 번 읽고 쓸 수 있으며 Redis에 메시지를 넣는 데는 한 번의 쓰기 작업만 필요하며 시간 소모는 밀리초 미만입니다.
그래서 대기열을 사용하면 말씀하신 밀리초 수준의 요구 사항을 완전히 충족할 수 있다고 생각합니다.

또한 비동기 작업을 수행하는 데 어떤 수단을 사용하더라도 항상 시간 오버헤드가 발생하며 이는 불가피합니다.

<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 스크립트의 최대 실행 시간을 의미합니다. 필요한 경우 제거할 수 있습니다.
비동기 구현을 위한 pclose(popen())의 핵심은 차단 코드를 실행하는 프로세스를 여는 것입니다.
자동이 필요하지 않은 비동기 시나리오에 적합합니다. 실행 완료 후 결과(콜백) 반환

문자열 매개변수 $arg를 작은따옴표로 묶을 수 있어 일부 공백의 영향을 피할 수 있지만 여전히 결함이 있습니다.
문자열 매개변수를 파일로 직렬화하는 것이 가장 좋습니다.
PHP는 파일 경로 매개변수를 전달하고
task.php는 파일을 읽고, 직렬화 해제하고, 역직렬화하고, 데이터를 가져옵니다.
파일 이름은 고유해야 합니다. 사용자 ID 또는 프로세스 PID와 임의의 시간 번호:

<code>$filename = md5(uniqid($uid.'_',        true));
$filename = md5(uniqid($getmypid().'_', true));</code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.