PHP에서 멀티스레딩을 구현한다고 생각하시나요? 이 제목을 보면 제가 미쳤다고 생각하실 것입니다. 하지만 실제로는
테스트
를 거친 몇 가지 방법이 있습니다.
PHP 자체는 멀티스레딩을 지원하지 않지만, 우리 웹 서버는 멀티스레딩을 지원합니다.
즉, 여러 사람이 동시에 접근할 수 있다는 점은 제가 PHP에서 멀티스레딩을 구현하는 기반이기도 합니다. .
지금 a.php 파일을 실행하고 있다고 가정합니다. 하지만 웹 서버에 프로그램에서 다른 b.php를 실행하도록 요청하면
두
파일이 동시에 실행됩니다.
전송되면 클라이언트가 종료되었는지 여부에 관계없이 웹 서버가 이를 실행합니다. )
때때로
우리가 실행하려는 것은 다른 파일이 아니라 이 파일에 있는 코드의 일부입니다.
매개변수를 사용하여 a.php가 실행되는 프로그램을 제어할 수 있습니다.
다음은 예입니다:
//a .php
PHP 코드:---------------------------------- - ----------------------------------
<?php
함수 runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); //여기서 두 번째 매개변수는 HTTP 프로토콜에 지정된 요청 헤더입니다.
//이해가 안되면 RFC의 정의를 참고하세요.
fclose($fp);
}
함수 a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
함수 b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
실행스레드();
에이();
}
else if($_GET['act'] == 'b') b();
?>
------------------------------------------------ --------------------------------
result_a.log와 result_b.log를 열고 두 파일의 액세스 시간을 비교하면 이 두 파일이 실제로 다른 스레드에서 실행되고 있음을 알 수 있습니다.
단순한
예일 뿐이며 다른 형태로 개선할 수도 있습니다.
이제 PHP에서 멀티스레딩을 사용할 수 있게 되었는데, 문제는 동기화입니다. PHP 자체에서는 멀티스레딩을 지원하지 않는다는 것을 알고 있는데,
Java에서는 어떻게 해야 할까요? 1.
충돌을 피하기 위해 동일한 리소스에 액세스하지 마십시오. 그러나 데이터베이스는 동시 작업을 지원하므로필요한 경우
동일한
파일에 데이터를 쓰지 마십시오. 쓰고 싶으면 다른 방법으로 동기화하세요. 예를 들어, Flock을 호출해 파일을 잠그거나, 임시 파일을 만들고다른 스레드에서 파일이 사라질 때까지 기다리세요. while(file_exits('xxx')); 이 임시 파일이 존재하면 스레드가 실제로 작동 중이라는 의미입니다
. 해당 파일이 없으면 다른 스레드가 해당 파일을 해제했다는 의미입니다.
2. runThread가 fputs를 실행한 후에는 이 소켓에서 데이터를 읽지 마십시오. 즉, fgets
와 같은
함수를 사용하면 즉시 반환되므로 블록킹 모드를 사용하면 프로그램에서 문제가 발생합니다. 멀티 스레드가 아닙니다.다음 프로그램을 실행하기 전에 기다려야 합니다. 따라서 데이터를 교환해야 하는 경우 최종적으로 외부 파일이나 데이터를 사용하여 완료할 수 있습니다. $fp)를 달성합니다.
이렇게 말하지만 실제적인 의미가 있습니까? 언제 이 방법을 사용해야 합니까?
대답은 '예'입니다. 우리 모두 알고 있듯이 네트워크 리소스를 지속적으로 읽는 응용 프로그램에서는 병목 현상이 발생합니다. 이 방법을 사용하면
여러 페이지를 동시에 여러 스레드로 읽을 수 있습니다.
8848, soaso 등의 쇼핑몰 웹사이트에서 정보를 검색할 수 있는 프로그램을 만들었습니다. 알리바바 홈페이지에서 업체정보와 회사 명부를 읽어오는 프로그램도 있고,
이 기술도 활용하고 있다. 두 프로그램 모두 정보를 읽고 데이터베이스에 저장하기 위해 지속적으로 서버에 연결해야 하기 때문입니다. 이 기술을 활용하면 응답을 기다리는 병목 현상이 제거됩니다.