자신만의 http 서버를 작성하면, 서버는 소켓을 수신하고, handler_request 스레드는 브라우저 PHP 동적 요청을 처리합니다.
<프리><코드> ... 동안(1){ if(-1 == (client_fd = accept(sockfd, (struct sockaddr *) &client_sock, &sin_size))) err_exit("accept"); if(pthread_create(&ntid, NULL, (void *)handle_request, &client_fd) != 0) err_exit("pthread_create"); } 닫기(sockfd); 0을 반환합니다.handle_request에서 php-fpm과 통신한 후 실행 결과 msg를 얻었습니다. msg에는 http 응답 헤더 정보 두 줄, 빈 줄과 응답 본문(php 코드 실행 결과)이 포함되어 있습니다. 응답 라인을 추가하기 위해 http 응답 패킷이 구성되어 최종적으로 클라이언트로 전송됩니다.
<프리><코드> ... /* 응답 보내기 */ sprintf(헤더, "%s 200 OK\r\n", hr->version); //printf("%s%s\n", 헤더, 메시지); send(client_fd, 헤더, strlen(헤더), 0); send(client_fd, msg, contentLength, 0); 무료(메시지); 닫기(클라이언트_fd);이상한 점은 브라우저에서 액세스할 때 PHP 실행 결과가 깜박인 다음 연결이 재설정되었다는 메시지가 표시된다는 것입니다.
Firefox가 127.0.0.1:8899에서 서버에 연결할 수 없습니다.
텔넷에서 테스트하면 완전한 http 응답 메시지를 수신할 수 있습니다.
127.0.0.1을 시도 중...
127.0.0.1에 연결되었습니다.
이스케이프 문자는 '^]'입니다.
GET /index.php HTTP/1.1
HTTP/1.1 200 확인
X-Powered-By: PHP/5.5.9-1ubuntu4.21
콘텐츠 유형: 텍스트/html
hello worldConnection이 외국 호스트에 의해 종료되었습니다.
php 프로그램
<코드><?php echo "안녕하세요";
디자인 문제가 매우 심각합니다.
&client_fd
传到pthread_create
很可能会引起连接丢失,因为你无法保证handle_request
在下一个accpet
성공하기 전에 실행해야 합니다. 또 다른 문제는 디자인이 형편없다면 적어도 전체 스레드 풀에 영향을 미칠 것이라는 점입니다...