일반적으로 PHP의 프로그램은 단일 프로세스이므로 한 문장이 실행될 때까지 다음 문장이 실행되지 않습니다. 그러나 특정 링크에 걸리면 프로그램을 실행할 방법이 없습니다. 이 문제를 해결하려면 비동기적인 또 다른 메커니즘이 필요합니다.
일반적으로 PHP의 프로그램은 한 문장을 실행한 후 다음 문장으로 이어집니다. (여기서는 PHP의 pcntl_fork() 함수 시리즈를 사용하지 않습니다. 제 방법이 훨씬 좋습니다. 그보다) 교육을 잘 받고 배고픈 사람들(이 두 끼의 식사를 먹지 않으면 죽을 수도 있고 모두가 이 식사를 가능한 한 빨리 먹고 싶어함)이 식사를 사려고 줄을 서 있는 것과 같습니다. 다음 식사 전에 식사를 마쳐야 하며, 잔돈이 1자오인 경우 다음 식사를 하기 전에 1자오와 1자오를 계산해야 합니다.
실제로 음식을 구매하기 위해 줄을 서서 한두 시간 늦는다면 문제가 되지 않을 수 있지만, 사용자에게 빠르게 대응해야 하는 시스템에서는 완전 로그인처럼 이런 현상이 발생하면 문제가 됩니다. 작업이 여러 단계로 나누어져 있는데, 단계별로 실행하면 한 단계에서 멈추면 로딩 버튼이 계속 돌아가는 것을 볼 수 있습니다... 이때는 메커니즘이 필요합니다. 이 문제를 해결하세요.
먼저 PHP의 프로세스 간 통신 확장인 sysvmsg에 대해 알아 보겠습니다. 이 확장은 linux/uinux에서만 사용할 수 있으며 다른 플랫폼에서는 사용할 수 없습니다. 확장자는 매우 간단합니다:
yum -y install php-process
물론, php를 설치했다는 전제입니다. 실행 후 다음 명령을 사용하여 설치 성공 여부를 확인합니다.
php -m | grep sysvmsg #若果看到sysvmsg说明安装成功了 #或者也可以这样 php -r 'var_dump(function_exists("msg_get_queue"))'; #若果看到true说明安装成功了
물론 위 명령은 php를 추가해야 합니다. 시스템 환경 변수의 경로입니다.
이 확장은 프로세스 간에 통신할 수 있습니다. 아래 예를 살펴보겠습니다.
Send, send.php
#!/usr/bin/php #上面的是我自己的php路径 <?php $ip = msg_get_queue(12340); //创建一个队列 msg_send($ip,1,"Test a message",false,false,$err);//像队列中塞一条消息
Receive, receive.php
#!/usr/bin/php <?php $ip = msg_get_queue(12340); //创建消息队列,和发送的要一致,不然收不到消息 while(msg_receive($ip,0,$msgtype,512,$data,false,null,$err)){ echo "使用内存: ".memory_get_usage()."\n"; //这里看下使用了多少内存 echo "收到的消息: $data\n"; //收到的消息在这里 }
프로그램을 실행해보면 메시지를 보내고 받는 것이 큐의 표준 FIFO를 따르는 것을 알 수 있으므로, 이를 기반으로 비동기 시스템을 설계할 수 있습니다. 이러한 특성.
이 기능을 사용하는 방법은 무엇입니까? 이렇게 생각해보세요. 프로그램이 실행될 때 확실히 많은 작업이 수행되어야 하지만 일부 작업은 지연될 수 있으며 일부 작업은 중요하지 않습니다. 시간이 많이 걸립니다.
예를 들어 로그인 로그를 기록하고 게임 내용을 기록하는 경우 프로그램이 실행될 때까지 기다릴 필요가 없습니다. (기다리면 문제가 발생할 수 있으며 시간이 많이 낭비됩니다. 중요하지 않은 작업이 너무 많습니다.) 작업할 항목을 대기열에 직접 던지는 것입니다.
그런 다음 수신된 메시지를 실행하기 위해 백그라운드에서 별도의 프로세스를 엽니다. receive.php와 마찬가지로 거기에서 계속 대기합니다. 메시지가 있으면 실행되고, 메시지가 없으면 차단됩니다. 이것은 성공적인 솔루션입니까? 프로그램 실행 중에 프로그램을 즉시 실행하지 않음으로써 시간이 낭비되는 문제를 해결합니다.
추천 학습: php 비디오 튜토리얼
위 내용은 단일 프로세스에서 비동기성이 그렇게 중요한가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!