이번 글은 스울을 배우는 과정과 그동안 채워왔던 함정, 스울이 얼마나 강력한지 주로 기록합니다!
먼저 swoole: PHP를 사용한 C 프로그램에 대한 나의 이해에 대해 이야기하겠습니다. 많은 PHPer 친구들은 swoole이 제공하는 강력한 기능과 외부 세계의 감탄을 보고 열심히 설치하고 데모를 디버깅하고 새로운 기능을 작성한 다음 서둘러 서로 신나게 이야기했습니다. 며칠 후 자신이 이해한대로 Swoole을 계속 사용하면 코드가 예상대로 실행되지 않는 것을 발견하고 욕하기 시작합니다. 도대체 코드는 기본적으로 데모와 동일합니다. 왜 작동하지 않습니까? 무슨 말도 안되는 일, 태스크, 공유 메모리, ipcs, 비동기식, 온갖 질문이 떠 올랐고, 공식 문서를 재빨리 확인한 결과 문서에는 이에 대한 언급이 없었고 사용 방법에 대한 간략한 소개가 있었습니다. 이때 나는 거의 희망을 잃었다.
몇 가지 문제가 발생했습니다.
1: phper에서 일반적으로 사용되는 전역에 대해 왜 변수 (전역)는 onRequest 함수에서 사용할 수 없습니다.
swoole은 다중 스레드 프로그래밍이므로 전역은 여러 프로세스 간에 공유될 수 없습니다. 예를 들어
<ol> <li><span><span>global $i = </span><span>0</span><span>; </span></span></li> <li><span> </span></li> <li><span>function onRequest() { </span></li> <li><span> </span></li> <li><span> echo $i++; </span></li> <li><span> </span></li> <li><span>} </span></li> </ol>
위 프로그램을 swoole에 작성하면 접근할 때마다 증가하는 숫자가 출력되지 않습니다. 기대하는 효과를 얻으려면 swoole_table의 관련 기능을 사용해야 합니다.
2: 비동기식과 콜백이란 무엇인가요?
PHP의 경우 비동기식과 콜백에 대한 이해는 아마도 ajax. swoole에서 비동기와 콜백에 대한 설명을 봤을 때 굉장히 단순해 보였기 때문에 멀티스레드 편집 경험도 없이 성급하게 swoole을 사용했습니다. 그러다 보니 속아서 제 구덩이를 채우기 위해 몇 밤 동안 몰래 코딩을 하게 되었습니다.
3: onReceive로 수신되는 데이터가 왜 그렇게 큰가요?
서버는 클라이언트가 보낸 여러 요청을 동시에 받을 수 있습니다. 클라이언트가 한 번 보내고 서버가 한 번 받는 것이 아닙니다.
4: Homemade httpsserve
http 서버를 작성한 후 다음을 통해 접속합니다. 브라우저 이 홈메이드 서버는 브라우저를 새로 고치는 이유는 무엇입니까? 이 문제는 아마도 swoole을 사용하여 처음으로 httpserver를 작성하는 많은 친구들에게 문제가 될 것입니다. 브라우저가 favicon.ico 요청을 하나 더 보내기 때문입니다.
이유
사실 대부분의 PHP 사용자는 웹을 만들고 비즈니스를 작성하는 것만 알고 있습니다. 논리. 서버 프로그램 개발을 이해하는 사람은 거의 없습니다. 한번은 친구가 swoole을 사용하여 간단한 서버와 클라이언트를 작성했는데 왜 시작했는데도 데이터를 수신할 수 없는지 물었습니다. 간단히 코드를 살펴보니 모든 연결이 실제로 성공했습니다. onReceive 콜백이 설정되었고 코드는 괜찮았습니다. 결국 서버와 클라이언트 모두 메시지 수신을 위한 콜백 함수를 설정했지만 어느 쪽도 다른 쪽에게 메시지를 보내지 않았고 두 쪽 끝은 서로 연결되어 있었습니다. 수가 막히게 하다. 그러자 스울 관계자들은 이런 상식적인 문제에 대해 아무런 설명도 하지 않고 콜백 설정 방법, 메시지 보내는 방법, 이런 일을 하는 방법, 저러는 방법만 이야기했다. 서버측 개발 경험이 있는 학생들의 경우, swoole 문서에서는 이러한 작업의 필요성을 명시할 필요가 없습니다. 왜냐하면 이는 상식이기 때문입니다. 하지만 phper의 경우 이 점을 지적하는 것이 매우 중요합니다. 위에서 언급한 것처럼 phper에는 이러한 지식이 없기 때문입니다. 서버 측 개발 경험을 가진 프로그래머만이 할 수 있습니다.
Swoole의 기능: 네트워크 통신 프레임워크, 비동기식, 멀티스레딩. 이러한 기능은 정확히 PHP의 불완전한 기능입니다(공식에서는 이러한 기능을 구현하기 위한 많은 기본 기능을 제공하지만 중국어 문서가 부족하고 이러한 기능을 구현하기 위해 PHP를 사용하는 사람이 거의 없습니다). 아시다시피, swoole을 함부로 사용하시면 swoole 공식 홈페이지에서는 찾아볼 수 없는 몇 가지 상식적인 문제에 직면하게 될 것입니다.
스울을 사용하기 위해 반드시 익혀야 할 기술
멀티 스레드 프로그래밍
프로세스 간 통신
네트워크 프로토콜 TCP/UDP 인식
PHP 기본기
개인 학습 경험
저도 오래전에는 PHP만 아는 프로그래머였습니다. 그러던 중 우연히 httpsqs를 사용해야 하게 되었는데, 한동안 사용하다가 뭔가 독특한 요구 사항이 있다는 것을 알게 됐습니다. 소스코드를 보세요. 보기는 정말 어렵지만 언뜻 보면 충격을 받을 것입니다. httpsqs는 단순한 패키지입니다. 내부에는 Tokyo Cabinet 데이터베이스가 포함되어 있습니다. 100줄이 넘습니다. 주요 아이디어는 C 언어로 libevent를 사용하여 Tokyo Cabinet 데이터베이스를 읽고 쓰기 위한 요청을 수신하는 http 서버를 만드는 것입니다. 당시에는 실제로 이 아이디어를 기반으로 한 프로그램이 많이 있었습니다. 나중에 문득 C언어에서도 libevent 함수를 사용할 수 있으니, PHP에서도 libevent를 사용하면 당연히 네트워크를 모니터링하고, 요청을 받은 후 데이터베이스를 읽고 쓰고, queue 서비스를 수행할 수 있겠다는 생각이 들었습니다. 나중에 공식 PHP 문서를 확인한 후 PHP가 이러한 기능을 완성하기 위한 완전한 기능 시스템을 제공하고 심지어 전체 멀티 스레드 기능 세트도 제공한다는 사실을 발견했습니다. 그러나 중국어 문서가 너무 적고 성숙한 코드가 너무 적습니다. 온라인에서는 거의 발견되지 않습니다. 최후의 수단으로 Linux-C 멀티 스레드 개발의 기본 원리, 프로세스 간 통신의 일반적인 방법을 배웠고 이를 사용하여 몇 가지 간단한 데모도 만들었습니다. 유일한 느낌은 간단한 함수를 작성하는 것이 디자인하기가 정말 복잡하다는 것입니다. 포기하려던 순간 스울이 나타났다. swoole에서 제공하는 기능은 정확히 php에 없는 기능인데, 정말 훌륭합니다. 네트워크 통신 프레임워크인 swoole은 서버를 설정하는 데 몇 줄의 간단한 설정만 필요합니다. 앞으로도 계속해서 비즈니스 코드를 개선해 나갈 것입니다. 나는 libevent 커뮤니케이션 그룹에서 Swoole의 디자인이 CC에서 가장 좋은 프레임워크 디자인은 아니지만 그 하이라이트는 기본 기능은 C로 캡슐화되고 비즈니스 기능은 세계 최고의 언어인 PHP로 작성되도록 남겨둔다는 점을 알게 되었습니다. . 그때부터 Swoole의 구멍 메우기 여정이 시작되었습니다.
요약
swoole은 단순한 PHP 프레임워크가 아닙니다. swoole 공식 홈페이지의 첫 문장 " " 재정의 PHP", 절대로 오래된 PHP 생각을 사용하여 스울 코드를 작성하지 마세요! swoole은 PHP를 다시 활성화하고 php는 swoole을 만듭니다!
위 내용은 스울에게 속은 PHP 프로그래머들을 소개하는 내용이 포함되어 있어 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.