Full Code of swoole/swoole-src for AI

master 79a82ecf36c3 cached
2870 files
10.9 MB
3.0M tokens
7256 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (11,932K chars total). Download the full file to get everything.
Repository: swoole/swoole-src
Branch: master
Commit: 79a82ecf36c3
Files: 2870
Total size: 10.9 MB

Directory structure:
gitextract_tv1z7_zt/

├── .clang-format
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE
│   ├── dependabot.yml
│   └── workflows/
│       ├── alpine.Dockerfile
│       ├── core.yml
│       ├── coverity.yml
│       ├── ext.yml
│       ├── framework.yml
│       ├── iouring.yml
│       ├── thread.yml
│       └── unit.yml
├── .gitignore
├── .php-cs-fixer.dist.php
├── CMakeLists.txt
├── Dockerfile
├── LICENSE
├── Makefile.frag
├── README.md
├── codecov.yml
├── composer.json
├── config.m4
├── core-tests/
│   ├── .gitignore
│   ├── code-stats.sh
│   ├── docker-compose.yml
│   ├── fuzz/
│   │   ├── project.json
│   │   └── src/
│   │       └── main.cpp
│   ├── include/
│   │   ├── httplib_client.h
│   │   ├── httplib_server.h
│   │   ├── redis_client.h
│   │   ├── test_core.h
│   │   ├── test_coroutine.h
│   │   ├── test_process.h
│   │   └── test_server.h
│   ├── js/
│   │   ├── .gitignore
│   │   ├── mqtt.js
│   │   ├── package.json
│   │   ├── ws_1.js
│   │   └── ws_2.js
│   ├── samples/
│   │   ├── CMakeLists.txt
│   │   └── src/
│   │       └── s1.cc
│   └── src/
│       ├── _lib/
│       │   ├── http.cpp
│       │   ├── process.cpp
│       │   ├── redis.cpp
│       │   ├── server.cpp
│       │   └── ssl.cpp
│       ├── core/
│       │   ├── base.cpp
│       │   ├── channel.cpp
│       │   ├── hash.cpp
│       │   ├── heap.cpp
│       │   ├── log.cpp
│       │   ├── string.cpp
│       │   ├── time.cpp
│       │   └── util.cpp
│       ├── coroutine/
│       │   ├── accept.cpp
│       │   ├── async.cpp
│       │   ├── base.cpp
│       │   ├── channel.cpp
│       │   ├── file.cpp
│       │   ├── gethostbyname.cpp
│       │   ├── hook.cpp
│       │   ├── http_server.cpp
│       │   ├── iouring.cpp
│       │   ├── socket.cpp
│       │   ├── system.cpp
│       │   └── uring_socket.cpp
│       ├── lock/
│       │   └── lock.cpp
│       ├── main.cpp
│       ├── memory/
│       │   ├── buffer.cpp
│       │   ├── fixed_pool.cpp
│       │   ├── global_memory.cpp
│       │   ├── lru_cache.cpp
│       │   ├── ringbuffer.cpp
│       │   └── table.cpp
│       ├── network/
│       │   ├── address.cpp
│       │   ├── client.cpp
│       │   ├── dns.cpp
│       │   ├── socket.cpp
│       │   └── stream.cpp
│       ├── os/
│       │   ├── async.cpp
│       │   ├── file.cpp
│       │   ├── msg_queue.cpp
│       │   ├── os.cpp
│       │   ├── pipe.cpp
│       │   ├── process_pool.cpp
│       │   ├── signal.cpp
│       │   ├── timer.cpp
│       │   └── wait.cpp
│       ├── protocol/
│       │   ├── base.cpp
│       │   ├── base64.cpp
│       │   ├── http2.cpp
│       │   ├── mime_type.cpp
│       │   ├── redis.cpp
│       │   └── ssl.cpp
│       ├── reactor/
│       │   └── base.cpp
│       └── server/
│           ├── buffer.cpp
│           ├── http_parser.cpp
│           ├── http_server.cpp
│           ├── message_bus.cpp
│           ├── mqtt.cpp
│           ├── multipart_parser.cpp
│           ├── port.cpp
│           └── server.cpp
├── docs/
│   ├── API.md
│   ├── CHANGELOG.md
│   ├── CODE-STYLE.md
│   ├── CPPLINT.cfg
│   ├── ISSUE.md
│   ├── SUPPORTED.md
│   ├── TESTS.md
│   ├── WORKFLOW-PARAMETERS.md
│   ├── google-style.xml
│   └── sponsors.md
├── examples/
│   ├── atomic/
│   │   ├── long.php
│   │   ├── test.php
│   │   └── wait.php
│   ├── client/
│   │   ├── c10k.php
│   │   ├── get_socket.php
│   │   ├── long_tcp.php
│   │   ├── recv_1m.php
│   │   ├── recv_file.php
│   │   ├── select.php
│   │   ├── simple.php
│   │   ├── sync.php
│   │   ├── test.txt
│   │   └── udp_sync.php
│   ├── coroutine/
│   │   ├── backtrace.php
│   │   ├── before_server_start.php
│   │   ├── behavior/
│   │   │   ├── do-while.php
│   │   │   ├── for.php
│   │   │   ├── foreach.php
│   │   │   ├── goto.php
│   │   │   ├── preemptive_timer.php
│   │   │   ├── tick.php
│   │   │   ├── while.php
│   │   │   └── while2.php
│   │   ├── cancel_throw.php
│   │   ├── channel/
│   │   │   └── test.php
│   │   ├── client_send_yield.php
│   │   ├── client_send_yield_server.php
│   │   ├── coro_array_map.php
│   │   ├── coro_call_user.php
│   │   ├── coro_channel.php
│   │   ├── coro_destruct.php
│   │   ├── coro_destuct.php
│   │   ├── coro_empty.php
│   │   ├── coro_gethost.php
│   │   ├── coro_include.php
│   │   ├── coro_invoke.php
│   │   ├── coro_nested.php
│   │   ├── coro_nested_empty.php
│   │   ├── coro_serialize.php
│   │   ├── coro_set_stack_size.php
│   │   ├── coro_sleep.php
│   │   ├── coro_stackless.php
│   │   ├── coro_util.php
│   │   ├── csp.php
│   │   ├── deadlock.php
│   │   ├── defer.php
│   │   ├── defer_client.php
│   │   ├── enable_coroutine.php
│   │   ├── exception/
│   │   │   └── empty.php
│   │   ├── exec.php
│   │   ├── exit_in_coroutine.php
│   │   ├── exit_with_status.php
│   │   ├── fgets.php
│   │   ├── fread.php
│   │   ├── fwrite.php
│   │   ├── gethostbyname.php
│   │   ├── http/
│   │   │   ├── server.php
│   │   │   └── write_func.php
│   │   ├── http2_client.php
│   │   ├── http_backend_serv.php
│   │   ├── http_client.php
│   │   ├── http_download.php
│   │   ├── http_server.php
│   │   ├── httpmulti.php
│   │   ├── join.php
│   │   ├── library/
│   │   │   └── base.php
│   │   ├── list_coroutines.php
│   │   ├── mysql_chan.php
│   │   ├── mysql_escape.php
│   │   ├── mysql_execute_empty.php
│   │   ├── mysql_prepare.php
│   │   ├── mysql_prepare_2.php
│   │   ├── mysql_procedure_exec.php
│   │   ├── mysql_query.php
│   │   ├── mysql_unixsocket.php
│   │   ├── pdo/
│   │   │   └── pdo_persistent.phpt
│   │   ├── proc_open.php
│   │   ├── reconnect_test.php
│   │   ├── redis/
│   │   │   ├── auth.php
│   │   │   ├── defer.php
│   │   │   ├── eval.php
│   │   │   ├── get.php
│   │   │   ├── multi.php
│   │   │   ├── pipeline.php
│   │   │   ├── pub.php
│   │   │   ├── request.php
│   │   │   ├── serialize.php
│   │   │   └── sub.php
│   │   ├── redis_pool.php
│   │   ├── redis_subscribe.php
│   │   ├── scheduler.php
│   │   ├── select/
│   │   │   ├── 1.php
│   │   │   ├── 2.php
│   │   │   ├── 3.php
│   │   │   ├── 4.php
│   │   │   ├── 5.php
│   │   │   ├── 6.php
│   │   │   ├── 7.php
│   │   │   ├── 8.php
│   │   │   ├── 9.php
│   │   │   ├── poptimeout.php
│   │   │   └── test.php
│   │   ├── send_yield.php
│   │   ├── send_yield_client.php
│   │   ├── server/
│   │   │   └── tcp.php
│   │   ├── sleep.php
│   │   ├── socket/
│   │   │   ├── accept.php
│   │   │   └── sendto.php
│   │   ├── stack/
│   │   │   ├── 1.php
│   │   │   └── 2.php
│   │   ├── stack.php
│   │   ├── statvfs.php
│   │   ├── task_co.php
│   │   ├── tcp_backend_serv.php
│   │   ├── tcp_echo.php
│   │   ├── test.php
│   │   ├── timer_test.php
│   │   ├── udp_client.php
│   │   ├── udp_tcp_timeout.php
│   │   ├── user_coroutine.php
│   │   ├── util/
│   │   │   ├── resume001.php
│   │   │   ├── resume002.php
│   │   │   └── resume003.php
│   │   ├── waitgroup.php
│   │   └── websocket/
│   │       ├── client.php
│   │       ├── co_server.php
│   │       └── server.php
│   ├── cpp/
│   │   ├── Makefile
│   │   ├── co.cc
│   │   ├── repeat.cc
│   │   └── test_server.cc
│   ├── curl/
│   │   ├── hook.php
│   │   ├── multi.php
│   │   └── server.php
│   ├── dtls/
│   │   ├── client.php
│   │   └── server.php
│   ├── eof/
│   │   ├── client.php
│   │   └── server.php
│   ├── event/
│   │   ├── cycle.php
│   │   ├── inotify.php
│   │   ├── sockets.php
│   │   ├── stdin.php
│   │   ├── stream.php
│   │   └── test.php
│   ├── http/
│   │   ├── UPPER.TXT
│   │   ├── client.php
│   │   ├── curl.php
│   │   ├── detach.php
│   │   ├── download.php
│   │   ├── empty.txt
│   │   ├── event-stream.php
│   │   ├── moc.moc
│   │   ├── no-compression.php
│   │   ├── post.data
│   │   ├── raw.php
│   │   ├── redirect.php
│   │   ├── server.php
│   │   ├── static_handler.php
│   │   ├── test.txt
│   │   └── url_rewrite.php
│   ├── http2/
│   │   ├── server.php
│   │   ├── streaming.php
│   │   └── test.html
│   ├── ipv6/
│   │   ├── tcp_client.php
│   │   ├── tcp_server.php
│   │   ├── udp_client.php
│   │   └── udp_server.php
│   ├── length/
│   │   ├── client.php
│   │   ├── config.php
│   │   ├── func.php
│   │   └── server.php
│   ├── lock/
│   │   └── lock.php
│   ├── misc/
│   │   ├── get_local_ip.php
│   │   ├── get_local_mac.php
│   │   └── version.php
│   ├── multicast/
│   │   ├── client.php
│   │   └── server.php
│   ├── php/
│   │   ├── buf_size.php
│   │   ├── debug_server.php
│   │   ├── error.php
│   │   ├── exception.php
│   │   ├── func.php
│   │   ├── inotify.php
│   │   ├── proc.php
│   │   ├── socket_client.php
│   │   ├── socket_server.php
│   │   ├── stream_client.php
│   │   ├── stream_server.php
│   │   └── tick.php
│   ├── postgresql/
│   │   └── postgresql_coro.php
│   ├── process/
│   │   ├── alarm.php
│   │   ├── async_master.php
│   │   ├── client.php
│   │   ├── client3.php
│   │   ├── close.php
│   │   ├── daemon.php
│   │   ├── echo.py
│   │   ├── exec.php
│   │   ├── func_timeout.php
│   │   ├── msg_pop.php
│   │   ├── msg_push.php
│   │   ├── msgqueue.php
│   │   ├── msgqueue2.php
│   │   ├── msgqueue_client.php
│   │   ├── msgqueue_pool.php
│   │   ├── pool_socket.php
│   │   ├── python.php
│   │   ├── select.php
│   │   ├── set_cpu_affinity.php
│   │   ├── stdin_stdout.php
│   │   ├── test.php
│   │   └── worker.php
│   ├── process_pool/
│   │   ├── detach.php
│   │   └── send.php
│   ├── runtime/
│   │   ├── coroutine.php
│   │   ├── curl.php
│   │   ├── file.php
│   │   ├── gethostbyname.php
│   │   ├── include.php
│   │   ├── mkdir.php
│   │   ├── mongodb.php
│   │   ├── oci.php
│   │   ├── odbc.php
│   │   ├── read.php
│   │   ├── rename.phpt
│   │   ├── select.php
│   │   ├── sleep.php
│   │   ├── sqlite.php
│   │   ├── ssl.php
│   │   ├── stream.php
│   │   ├── sync.php
│   │   ├── time_sleep_until.php
│   │   └── unlink.phpt
│   ├── server/
│   │   ├── db_pool.php
│   │   ├── dispatch_func.php
│   │   ├── dispatch_stream.php
│   │   ├── echo.php
│   │   ├── eof_client.php
│   │   ├── eof_server.php
│   │   ├── getReceivedTime.php
│   │   ├── host_update.php
│   │   ├── hot_update_class.php
│   │   ├── ip_dispatch.php
│   │   ├── length_client.php
│   │   ├── length_server.php
│   │   ├── listen_1k_port.php
│   │   ├── local_listener.php
│   │   ├── manager_timer.php
│   │   ├── mixed.php
│   │   ├── multi_instance.php
│   │   ├── multi_port.php
│   │   ├── pipe_message.php
│   │   ├── proxy_sync.php
│   │   ├── redis_pool.php
│   │   ├── reload_aysnc.php
│   │   ├── reload_force.php
│   │   ├── reload_force2.php
│   │   ├── send_1m.php
│   │   ├── sendfile.php
│   │   ├── single.php
│   │   ├── tcp_client.php
│   │   ├── tcp_server.php
│   │   ├── trace.php
│   │   ├── uid_dispatch.php
│   │   ├── unix_stream.php
│   │   └── zmq.php
│   ├── socket_coro/
│   │   ├── client.php
│   │   ├── server.php
│   │   └── udp.php
│   ├── ssl/
│   │   ├── ca/
│   │   │   ├── ca-cert.pem
│   │   │   ├── ca-key.pem
│   │   │   ├── ca-req.csr
│   │   │   ├── client-cert.pem
│   │   │   ├── client-key.pem
│   │   │   ├── client-req.csr
│   │   │   ├── client.crt
│   │   │   ├── client.key
│   │   │   ├── server-cert.pem
│   │   │   ├── server-key.pem
│   │   │   └── server-req.csr
│   │   ├── client.c
│   │   ├── client.php
│   │   ├── co_client.php
│   │   ├── gen_cert.md
│   │   ├── http_client.php
│   │   ├── passphrase.php
│   │   ├── server.php
│   │   ├── ssl.crt
│   │   ├── ssl.csr
│   │   ├── ssl.key
│   │   ├── ssl_passwd/
│   │   │   ├── ssl.crt
│   │   │   ├── ssl.csr
│   │   │   └── ssl.key
│   │   ├── stream_client.php
│   │   ├── swoole.log
│   │   ├── webserver.php
│   │   ├── websocket_client.html
│   │   └── websocket_server.php
│   ├── stdext/
│   │   ├── array.php
│   │   ├── foreach.php
│   │   ├── ref.php
│   │   ├── string.php
│   │   ├── typed_array.php
│   │   └── typed_array_map.php
│   ├── table/
│   │   ├── deadlock.php
│   │   ├── iterator.php
│   │   ├── server.php
│   │   ├── set.php
│   │   ├── simulation.php
│   │   └── usage.php
│   ├── task/
│   │   ├── http.php
│   │   ├── msg_push.php
│   │   ├── shared_client.php
│   │   ├── shared_server.php
│   │   ├── task.php
│   │   ├── task_coro.php
│   │   ├── task_num.php
│   │   ├── task_queue.php
│   │   └── task_stream.php
│   ├── thread/
│   │   ├── aio.php
│   │   ├── argv.php
│   │   ├── array.php
│   │   ├── atomic.php
│   │   ├── benchmark.php
│   │   ├── co.php
│   │   ├── exit.php
│   │   ├── hook.php
│   │   ├── lock.php
│   │   ├── map.php
│   │   ├── mt.php
│   │   ├── nested_map.php
│   │   ├── pipe.php
│   │   ├── run_test.php
│   │   ├── server.php
│   │   ├── signal.php
│   │   ├── socket.php
│   │   ├── test.php
│   │   ├── thread_pool.php
│   │   └── thread_server.php
│   ├── timer/
│   │   ├── after.php
│   │   ├── clear.php
│   │   ├── enable_coroutine.php
│   │   └── tick.php
│   ├── tracer/
│   │   ├── blocking.php
│   │   ├── cli.php
│   │   ├── co.php
│   │   ├── co_server.php
│   │   ├── co_socket.php
│   │   ├── fn_call.php
│   │   └── gc.php
│   ├── udp/
│   │   ├── client.php
│   │   └── server.php
│   ├── unixsock/
│   │   ├── dgram_client.php
│   │   ├── dgram_server.php
│   │   ├── stream_client.php
│   │   └── stream_server.php
│   ├── websocket/
│   │   ├── client.html
│   │   ├── client.php
│   │   └── server.php
│   └── www/
│       ├── dir1/
│       │   ├── file1.txt
│       │   └── file2.txt
│       ├── dir2/
│       │   ├── file1.txt
│       │   ├── file2.txt
│       │   └── index.txt
│       ├── file1.txt
│       ├── file2.txt
│       ├── index.html
│       └── index.txt
├── ext-src/
│   ├── php_swoole.cc
│   ├── php_swoole_call_stack.h
│   ├── php_swoole_client.h
│   ├── php_swoole_coroutine.h
│   ├── php_swoole_coroutine_system.h
│   ├── php_swoole_curl.h
│   ├── php_swoole_cxx.cc
│   ├── php_swoole_cxx.h
│   ├── php_swoole_firebird.h
│   ├── php_swoole_ftp_def.h
│   ├── php_swoole_http.h
│   ├── php_swoole_http_server.h
│   ├── php_swoole_library.h
│   ├── php_swoole_odbc.h
│   ├── php_swoole_oracle.h
│   ├── php_swoole_pgsql.h
│   ├── php_swoole_private.h
│   ├── php_swoole_process.h
│   ├── php_swoole_server.h
│   ├── php_swoole_sqlite.h
│   ├── php_swoole_ssh2.h
│   ├── php_swoole_ssh2_def.h
│   ├── php_swoole_ssh2_hook.h
│   ├── php_swoole_stdext.h
│   ├── php_swoole_thread.h
│   ├── php_swoole_websocket.h
│   ├── stubs/
│   │   ├── php_swoole.stub.php
│   │   ├── php_swoole_arginfo.h
│   │   ├── php_swoole_atomic.stub.php
│   │   ├── php_swoole_atomic_arginfo.h
│   │   ├── php_swoole_channel_coro.stub.php
│   │   ├── php_swoole_channel_coro_arginfo.h
│   │   ├── php_swoole_client.stub.php
│   │   ├── php_swoole_client_arginfo.h
│   │   ├── php_swoole_client_async.stub.php
│   │   ├── php_swoole_client_async_arginfo.h
│   │   ├── php_swoole_client_coro.stub.php
│   │   ├── php_swoole_client_coro_arginfo.h
│   │   ├── php_swoole_coroutine.stub.php
│   │   ├── php_swoole_coroutine_arginfo.h
│   │   ├── php_swoole_coroutine_lock.stub.php
│   │   ├── php_swoole_coroutine_lock_arginfo.h
│   │   ├── php_swoole_coroutine_scheduler.stub.php
│   │   ├── php_swoole_coroutine_scheduler_arginfo.h
│   │   ├── php_swoole_coroutine_system.stub.php
│   │   ├── php_swoole_coroutine_system_arginfo.h
│   │   ├── php_swoole_event.stub.php
│   │   ├── php_swoole_event_arginfo.h
│   │   ├── php_swoole_ex.stub.php
│   │   ├── php_swoole_ex_arginfo.h
│   │   ├── php_swoole_ftp.stub.php
│   │   ├── php_swoole_ftp_arginfo.h
│   │   ├── php_swoole_http2_client_coro.stub.php
│   │   ├── php_swoole_http2_client_coro_arginfo.h
│   │   ├── php_swoole_http_client_coro.stub.php
│   │   ├── php_swoole_http_client_coro_arginfo.h
│   │   ├── php_swoole_http_cookie.stub.php
│   │   ├── php_swoole_http_cookie_arginfo.h
│   │   ├── php_swoole_http_request.stub.php
│   │   ├── php_swoole_http_request_arginfo.h
│   │   ├── php_swoole_http_response.stub.php
│   │   ├── php_swoole_http_response_arginfo.h
│   │   ├── php_swoole_http_server_coro.stub.php
│   │   ├── php_swoole_http_server_coro_arginfo.h
│   │   ├── php_swoole_lock.stub.php
│   │   ├── php_swoole_lock_arginfo.h
│   │   ├── php_swoole_name_resolver.stub.php
│   │   ├── php_swoole_name_resolver_arginfo.h
│   │   ├── php_swoole_process.stub.php
│   │   ├── php_swoole_process_arginfo.h
│   │   ├── php_swoole_process_pool.stub.php
│   │   ├── php_swoole_process_pool_arginfo.h
│   │   ├── php_swoole_redis_server.stub.php
│   │   ├── php_swoole_redis_server_arginfo.h
│   │   ├── php_swoole_runtime.stub.php
│   │   ├── php_swoole_runtime_arginfo.h
│   │   ├── php_swoole_server.stub.php
│   │   ├── php_swoole_server_arginfo.h
│   │   ├── php_swoole_server_port.stub.php
│   │   ├── php_swoole_server_port_arginfo.h
│   │   ├── php_swoole_socket_coro.stub.php
│   │   ├── php_swoole_socket_coro_arginfo.h
│   │   ├── php_swoole_ssh2.stub.php
│   │   ├── php_swoole_ssh2_arginfo.h
│   │   ├── php_swoole_stdext.stub.php
│   │   ├── php_swoole_stdext_arginfo.h
│   │   ├── php_swoole_table.stub.php
│   │   ├── php_swoole_table_arginfo.h
│   │   ├── php_swoole_thread.stub.php
│   │   ├── php_swoole_thread_arginfo.h
│   │   ├── php_swoole_thread_arraylist.stub.php
│   │   ├── php_swoole_thread_arraylist_arginfo.h
│   │   ├── php_swoole_thread_atomic.stub.php
│   │   ├── php_swoole_thread_atomic_arginfo.h
│   │   ├── php_swoole_thread_barrier.stub.php
│   │   ├── php_swoole_thread_barrier_arginfo.h
│   │   ├── php_swoole_thread_lock.stub.php
│   │   ├── php_swoole_thread_lock_arginfo.h
│   │   ├── php_swoole_thread_map.stub.php
│   │   ├── php_swoole_thread_map_arginfo.h
│   │   ├── php_swoole_thread_queue.stub.php
│   │   ├── php_swoole_thread_queue_arginfo.h
│   │   ├── php_swoole_timer.stub.php
│   │   ├── php_swoole_timer_arginfo.h
│   │   ├── php_swoole_tracer.stub.php
│   │   ├── php_swoole_tracer_arginfo.h
│   │   ├── php_swoole_websocket.stub.php
│   │   └── php_swoole_websocket_arginfo.h
│   ├── swoole_admin_server.cc
│   ├── swoole_async_coro.cc
│   ├── swoole_atomic.cc
│   ├── swoole_channel_coro.cc
│   ├── swoole_client.cc
│   ├── swoole_client_async.cc
│   ├── swoole_client_coro.cc
│   ├── swoole_coroutine.cc
│   ├── swoole_coroutine_lock.cc
│   ├── swoole_coroutine_scheduler.cc
│   ├── swoole_coroutine_system.cc
│   ├── swoole_curl.cc
│   ├── swoole_curl_interface.h
│   ├── swoole_event.cc
│   ├── swoole_firebird.cc
│   ├── swoole_http2_client_coro.cc
│   ├── swoole_http2_server.cc
│   ├── swoole_http_client_coro.cc
│   ├── swoole_http_cookie.cc
│   ├── swoole_http_request.cc
│   ├── swoole_http_response.cc
│   ├── swoole_http_server.cc
│   ├── swoole_http_server_coro.cc
│   ├── swoole_lock.cc
│   ├── swoole_name_resolver.cc
│   ├── swoole_odbc.cc
│   ├── swoole_oracle.cc
│   ├── swoole_pgsql.cc
│   ├── swoole_process.cc
│   ├── swoole_process_pool.cc
│   ├── swoole_redis_server.cc
│   ├── swoole_runtime.cc
│   ├── swoole_server.cc
│   ├── swoole_server_port.cc
│   ├── swoole_socket_coro.cc
│   ├── swoole_sqlite.cc
│   ├── swoole_stdext.cc
│   ├── swoole_table.cc
│   ├── swoole_thread.cc
│   ├── swoole_thread_arraylist.cc
│   ├── swoole_thread_atomic.cc
│   ├── swoole_thread_barrier.cc
│   ├── swoole_thread_lock.cc
│   ├── swoole_thread_map.cc
│   ├── swoole_thread_queue.cc
│   ├── swoole_timer.cc
│   ├── swoole_tracer.cc
│   └── swoole_websocket_server.cc
├── gdbinit
├── include/
│   ├── helper/
│   │   └── kqueue.h
│   ├── swoole.h
│   ├── swoole_api.h
│   ├── swoole_asm_context.h
│   ├── swoole_async.h
│   ├── swoole_atomic.h
│   ├── swoole_base64.h
│   ├── swoole_buffer.h
│   ├── swoole_channel.h
│   ├── swoole_client.h
│   ├── swoole_config.h
│   ├── swoole_coroutine.h
│   ├── swoole_coroutine_api.h
│   ├── swoole_coroutine_channel.h
│   ├── swoole_coroutine_context.h
│   ├── swoole_coroutine_socket.h
│   ├── swoole_coroutine_system.h
│   ├── swoole_dtls.h
│   ├── swoole_error.h
│   ├── swoole_file.h
│   ├── swoole_file_hook.h
│   ├── swoole_hash.h
│   ├── swoole_heap.h
│   ├── swoole_http.h
│   ├── swoole_http2.h
│   ├── swoole_iouring.h
│   ├── swoole_llhttp.h
│   ├── swoole_lock.h
│   ├── swoole_log.h
│   ├── swoole_lru_cache.h
│   ├── swoole_memory.h
│   ├── swoole_message_bus.h
│   ├── swoole_mime_type.h
│   ├── swoole_mqtt.h
│   ├── swoole_msg_queue.h
│   ├── swoole_pipe.h
│   ├── swoole_process_pool.h
│   ├── swoole_protocol.h
│   ├── swoole_proxy.h
│   ├── swoole_reactor.h
│   ├── swoole_redis.h
│   ├── swoole_server.h
│   ├── swoole_signal.h
│   ├── swoole_socket.h
│   ├── swoole_socket_hook.h
│   ├── swoole_socket_impl.h
│   ├── swoole_ssl.h
│   ├── swoole_static_handler.h
│   ├── swoole_string.h
│   ├── swoole_table.h
│   ├── swoole_thread.h
│   ├── swoole_timer.h
│   ├── swoole_uring_socket.h
│   ├── swoole_util.h
│   ├── swoole_version.h
│   └── swoole_websocket.h
├── package.xml
├── php-cs-fix
├── php_swoole.h
├── php_swoole_api.h
├── run-core-tests.sh
├── scripts/
│   ├── .gitignore
│   ├── clear.sh
│   ├── code-format.sh
│   ├── code-stats.sh
│   ├── debug/
│   │   ├── swoole_info.php
│   │   └── swoole_table_implements.php
│   ├── docker-compile-with-iouring.sh
│   ├── docker-compile-with-thread.sh
│   ├── docker-compile.sh
│   ├── docker-compose.yml
│   ├── docker-iouring-route.sh
│   ├── docker-route.sh
│   ├── docker-thread-route.sh
│   ├── format-changed-files.sh
│   ├── install-deps-on-ubuntu.sh
│   ├── install-liburing.sh
│   ├── library.sh
│   ├── make.sh
│   ├── pecl-install.sh
│   ├── rename.php
│   ├── route.sh
│   ├── run-tests.sh
│   ├── simple-compile-on-github.sh
│   └── simple-compile.sh
├── src/
│   ├── core/
│   │   ├── base.cc
│   │   ├── base64.cc
│   │   ├── buffer.cc
│   │   ├── channel.cc
│   │   ├── crc32.cc
│   │   ├── error.cc
│   │   ├── heap.cc
│   │   ├── log.cc
│   │   ├── misc.cc
│   │   ├── string.cc
│   │   └── timer.cc
│   ├── coroutine/
│   │   ├── base.cc
│   │   ├── channel.cc
│   │   ├── context.cc
│   │   ├── file.cc
│   │   ├── file_lock.cc
│   │   ├── hook.cc
│   │   ├── iouring.cc
│   │   ├── socket.cc
│   │   ├── system.cc
│   │   ├── thread_context.cc
│   │   └── uring_socket.cc
│   ├── lock/
│   │   ├── barrier.cc
│   │   ├── coroutine_lock.cc
│   │   ├── mutex.cc
│   │   ├── rw_lock.cc
│   │   └── spin_lock.cc
│   ├── memory/
│   │   ├── fixed_pool.cc
│   │   ├── global_memory.cc
│   │   ├── ring_buffer.cc
│   │   ├── shared_memory.cc
│   │   └── table.cc
│   ├── network/
│   │   ├── address.cc
│   │   ├── client.cc
│   │   ├── dns.cc
│   │   ├── socket.cc
│   │   └── stream.cc
│   ├── os/
│   │   ├── async_thread.cc
│   │   ├── base.cc
│   │   ├── file.cc
│   │   ├── msg_queue.cc
│   │   ├── pipe.cc
│   │   ├── process_pool.cc
│   │   ├── sendfile.cc
│   │   ├── signal.cc
│   │   ├── timer.cc
│   │   ├── unix_socket.cc
│   │   └── wait.cc
│   ├── protocol/
│   │   ├── base.cc
│   │   ├── dtls.cc
│   │   ├── http.cc
│   │   ├── http2.cc
│   │   ├── message_bus.cc
│   │   ├── mime_type.cc
│   │   ├── mqtt.cc
│   │   ├── redis.cc
│   │   ├── socks5.cc
│   │   ├── ssl.cc
│   │   └── websocket.cc
│   ├── reactor/
│   │   ├── base.cc
│   │   ├── epoll.cc
│   │   ├── kqueue.cc
│   │   └── poll.cc
│   ├── server/
│   │   ├── base.cc
│   │   ├── manager.cc
│   │   ├── master.cc
│   │   ├── port.cc
│   │   ├── process.cc
│   │   ├── reactor_process.cc
│   │   ├── reactor_thread.cc
│   │   ├── static_handler.cc
│   │   ├── task_worker.cc
│   │   ├── thread.cc
│   │   └── worker.cc
│   └── wrapper/
│       ├── event.cc
│       ├── http.cc
│       └── timer.cc
├── tests/
│   ├── CONTRIBUTION
│   ├── README.md
│   ├── clean
│   ├── include/
│   │   ├── api/
│   │   │   ├── curl_multi.php
│   │   │   ├── exit.php
│   │   │   ├── http_server.php
│   │   │   ├── http_test_cases.php
│   │   │   ├── swoole_callback/
│   │   │   │   └── swoole_cannot_destroy_active_lambda_function.php
│   │   │   ├── swoole_client/
│   │   │   │   ├── connect_timeout.php
│   │   │   │   ├── connect_twice.php
│   │   │   │   ├── http_get.php
│   │   │   │   ├── opcode_client.php
│   │   │   │   ├── simple_client.php
│   │   │   │   └── socket_free.php
│   │   │   ├── swoole_http_server/
│   │   │   │   ├── http_server.php
│   │   │   │   ├── http_server_without_response.php
│   │   │   │   ├── simple_http_server.php
│   │   │   │   └── simple_https_server.php
│   │   │   ├── swoole_server/
│   │   │   │   ├── TestServer.php
│   │   │   │   ├── multi_protocol_server.php
│   │   │   │   ├── opcode_server.php
│   │   │   │   ├── reconnect_fail/
│   │   │   │   │   ├── tcp_client.php
│   │   │   │   │   └── tcp_serv.php
│   │   │   │   ├── server_manager_process_exit.php
│   │   │   │   ├── server_send_fast_recv_slow.php
│   │   │   │   ├── simple_server.php
│   │   │   │   ├── simple_tcp_server.php
│   │   │   │   ├── simple_udp_server.php
│   │   │   │   ├── tcp_serv.php
│   │   │   │   ├── tcp_task_server.php
│   │   │   │   └── testsendfile.txt
│   │   │   ├── swoole_thread/
│   │   │   │   ├── putenv.php
│   │   │   │   └── sleep.php
│   │   │   ├── swoole_timer/
│   │   │   │   ├── accurate_test.php
│   │   │   │   ├── fixRate_vs_fixDelay.php
│   │   │   │   ├── invalid_args.php
│   │   │   │   ├── multi_timer.php
│   │   │   │   └── register_shutdown_priority.php
│   │   │   ├── swoole_websocket_server/
│   │   │   │   ├── send_large_request_data.php
│   │   │   │   ├── send_small_request_data.php
│   │   │   │   ├── swoole_websocket_server.php
│   │   │   │   └── websocket_client.php
│   │   │   ├── syntax_error.txt
│   │   │   ├── tcp_server.php
│   │   │   └── test_classes/
│   │   │       ├── A.php
│   │   │       ├── A2.php
│   │   │       └── B.php
│   │   ├── bootstrap.php
│   │   ├── config.php
│   │   ├── functions.php
│   │   ├── lib/
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── Assert.php
│   │   │       ├── ChildProcess.php
│   │   │       ├── CoServer.php
│   │   │       ├── CurlManager.php
│   │   │       ├── DbWrapper.php
│   │   │       ├── LengthServer.php
│   │   │       ├── MQTT/
│   │   │       │   └── Helper.php
│   │   │       ├── MysqlPool.php
│   │   │       ├── ProcessManager.php
│   │   │       ├── RandStr.php
│   │   │       ├── Redis/
│   │   │       │   ├── DBConnectException.php
│   │   │       │   ├── Lock.php
│   │   │       │   ├── Redis.php
│   │   │       │   └── SQLPool.php
│   │   │       ├── Samtleben/
│   │   │       │   └── WebsocketClient.php
│   │   │       ├── ServerManager.php
│   │   │       ├── TcpStat.php
│   │   │       ├── ThreadManager.php
│   │   │       ├── WaitRef.php
│   │   │       └── responder/
│   │   │           └── get.php
│   │   ├── macos/
│   │   │   └── phpstorm.py
│   │   ├── skipif.inc
│   │   └── ssl_certs/
│   │       ├── ca-cert.pem
│   │       ├── ca-key.pem
│   │       ├── ca-req.csr
│   │       ├── ca.crt
│   │       ├── ca.csr
│   │       ├── ca.key
│   │       ├── ca.srl
│   │       ├── client-cert.pem
│   │       ├── client-expired.crt
│   │       ├── client-expired.csr
│   │       ├── client-expired.key
│   │       ├── client-key.pem
│   │       ├── client-req.csr
│   │       ├── client.crt
│   │       ├── client.csr
│   │       ├── client.key
│   │       ├── client.pem
│   │       ├── dhparams.pem
│   │       ├── mosquitto.org.crt
│   │       ├── passwd.crt
│   │       ├── passwd_key.pem
│   │       ├── server-cert.pem
│   │       ├── server-key.pem
│   │       ├── server-req.csr
│   │       ├── server.crt
│   │       ├── server.csr
│   │       ├── server.key
│   │       ├── server.pem
│   │       ├── sni_server_ca.pem
│   │       ├── sni_server_cs.pem
│   │       ├── sni_server_cs_cert.pem
│   │       ├── sni_server_cs_key.pem
│   │       ├── sni_server_uk.pem
│   │       ├── sni_server_uk_cert.pem
│   │       ├── sni_server_uk_key.pem
│   │       ├── sni_server_us.pem
│   │       ├── sni_server_us_cert.pem
│   │       └── sni_server_us_key.pem
│   ├── init
│   ├── new
│   ├── pgsql.sql
│   ├── run-tests
│   ├── start.sh
│   ├── swoole_atomic/
│   │   ├── atomic.phpt
│   │   ├── dtor_in_child.phpt
│   │   ├── multi_wakeup.phpt
│   │   ├── wait.phpt
│   │   ├── wait_and_wakeup.phpt
│   │   └── wait_ex.phpt
│   ├── swoole_channel_coro/
│   │   ├── 1.phpt
│   │   ├── 10.phpt
│   │   ├── 2.phpt
│   │   ├── 3.phpt
│   │   ├── 4.phpt
│   │   ├── 5.phpt
│   │   ├── 6.phpt
│   │   ├── 7.phpt
│   │   ├── 8.phpt
│   │   ├── 9.phpt
│   │   ├── basic.phpt
│   │   ├── benchmark.phpt
│   │   ├── blocking_timeout.phpt
│   │   ├── bug_1947.phpt
│   │   ├── bug_clear_timer.phpt
│   │   ├── chan_select_timeout.phpt
│   │   ├── chan_stats.phpt
│   │   ├── close.phpt
│   │   ├── coro_wait.phpt
│   │   ├── discard.phpt
│   │   ├── fibonacci.phpt
│   │   ├── http2.phpt
│   │   ├── hybird_chan.phpt
│   │   ├── hybird_chan2.phpt
│   │   ├── hybird_chan3.phpt
│   │   ├── lock.phpt
│   │   ├── no_ctor.phpt
│   │   ├── pool.phpt
│   │   ├── pop_after_close.phpt
│   │   ├── pop_close1.phpt
│   │   ├── pop_timeout1.phpt
│   │   ├── pop_timeout2.phpt
│   │   ├── pop_timeout3.phpt
│   │   ├── pop_timeout4.phpt
│   │   ├── pop_timeout5.phpt
│   │   ├── pop_timeout6.phpt
│   │   ├── pop_timeout7.phpt
│   │   ├── pop_timeout8.phpt
│   │   ├── push_close1.phpt
│   │   ├── push_timeout1.phpt
│   │   ├── push_timeout2.phpt
│   │   ├── push_timeout3.phpt
│   │   ├── push_timeout4.phpt
│   │   └── type.phpt
│   ├── swoole_client_async/
│   │   ├── base.phpt
│   │   ├── big_package_memory_leak.phpt
│   │   ├── buffer_full.phpt
│   │   ├── connect_dns.phpt
│   │   ├── connect_refuse.phpt
│   │   ├── connect_refuse_udg.phpt
│   │   ├── connect_refuse_unix.phpt
│   │   ├── connect_timeout.phpt
│   │   ├── connect_twice.phpt
│   │   ├── enableSSL.phpt
│   │   ├── enableSSL_bad_callback.phpt
│   │   ├── enableSSL_before_connect.phpt
│   │   ├── eof.phpt
│   │   ├── eof_close.phpt
│   │   ├── getSocket_bug.phpt
│   │   ├── getpeername.phpt
│   │   ├── getsockname.phpt
│   │   ├── length_protocol.phpt
│   │   ├── length_protocol_func.phpt
│   │   ├── port_invalid.phpt
│   │   ├── sendfile.phpt
│   │   └── sleep_wake.phpt
│   ├── swoole_client_coro/
│   │   ├── bug_2346.phpt
│   │   ├── close.phpt
│   │   ├── close_in_other_co.phpt
│   │   ├── close_resume.phpt
│   │   ├── close_socket_property.phpt
│   │   ├── close_twice.phpt
│   │   ├── connect_dns_timeout.phpt
│   │   ├── connect_timeout.phpt
│   │   ├── connect_with_dns.phpt
│   │   ├── dtls.phpt
│   │   ├── enableSSL.phpt
│   │   ├── eof.phpt
│   │   ├── eof_02.phpt
│   │   ├── eof_03.phpt
│   │   ├── eof_04.phpt
│   │   ├── export_socket.phpt
│   │   ├── fixed_package.phpt
│   │   ├── getpeername.phpt
│   │   ├── getsockname.phpt
│   │   ├── isConnected.phpt
│   │   ├── length_01.phpt
│   │   ├── length_02.phpt
│   │   ├── length_03.phpt
│   │   ├── length_04.phpt
│   │   ├── length_protocol_func.phpt
│   │   ├── length_types.phpt
│   │   ├── read_and_write.phpt
│   │   ├── reconnect.phpt
│   │   ├── reconnect_2.phpt
│   │   ├── reconnect_3.phpt
│   │   ├── recv_after_close.phpt
│   │   ├── recv_bad_packet.phpt
│   │   ├── recv_timeout.phpt
│   │   ├── recv_timeout2.phpt
│   │   ├── recvfrom.phpt
│   │   ├── recvfrom_2.phpt
│   │   ├── recvfrom_timeout.phpt
│   │   ├── recvfrom_timeout2.phpt
│   │   ├── send_big.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendto.phpt
│   │   ├── ssl.phpt
│   │   ├── ssl_verify.phpt
│   │   ├── tcp_client.phpt
│   │   ├── tcp_nodelay.phpt
│   │   ├── timeout.phpt
│   │   ├── udp_client.phpt
│   │   ├── udp_recv_failed.phpt
│   │   ├── unsock_dgram.phpt
│   │   └── unsock_stream.phpt
│   ├── swoole_client_sync/
│   │   ├── bind_address.phpt
│   │   ├── connect_1.phpt
│   │   ├── connect_2.phpt
│   │   ├── connect_3.phpt
│   │   ├── enableSSL.phpt
│   │   ├── enableSSL_2.phpt
│   │   ├── eof.phpt
│   │   ├── eof_close.phpt
│   │   ├── eof_timeout.phpt
│   │   ├── http_proxy.phpt
│   │   ├── keep1.phpt
│   │   ├── keep2.phpt
│   │   ├── keep3.phpt
│   │   ├── keep4.phpt
│   │   ├── keep5.phpt
│   │   ├── keep6.phpt
│   │   ├── length_protocol.phpt
│   │   ├── length_protocol_02.phpt
│   │   ├── length_protocol_func.phpt
│   │   ├── recv_in_task.phpt
│   │   ├── recv_timeout.phpt
│   │   ├── recv_with_open_eof_check.phpt
│   │   ├── select.phpt
│   │   ├── select_null.phpt
│   │   ├── send_recv.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendto.phpt
│   │   ├── socks5_proxy.phpt
│   │   ├── ssl_recv_timeout.phpt
│   │   ├── sync_send_recv.phpt
│   │   ├── udg_send_timeout.phpt
│   │   └── udp_client_sendto.phpt
│   ├── swoole_coroutine/
│   │   ├── after_start_server_1.phpt
│   │   ├── all_asleep.phpt
│   │   ├── array_walk.phpt
│   │   ├── array_walk_deep.phpt
│   │   ├── async_callback/
│   │   │   ├── event_cycle.phpt
│   │   │   ├── signal.phpt
│   │   │   └── timer.phpt
│   │   ├── autoload.phpt
│   │   ├── autoload_not_found.phpt
│   │   ├── autoload_not_found_not_in_coroutine.phpt
│   │   ├── autoload_not_in_coroutine.phpt
│   │   ├── bailout/
│   │   │   ├── co_redis_in_shutdown_function.phpt
│   │   │   ├── error.phpt
│   │   │   ├── error_in.phpt
│   │   │   ├── error_internal.phpt
│   │   │   ├── error_internal2.phpt
│   │   │   ├── error_out.phpt
│   │   │   └── exit.phpt
│   │   ├── before_create_server_1.phpt
│   │   ├── before_create_server_2.phpt
│   │   ├── before_create_server_3.phpt
│   │   ├── bug_2387.phpt
│   │   ├── bug_5699.phpt
│   │   ├── c_stack_size.phpt
│   │   ├── call_not_exists_func.phpt
│   │   ├── call_user_func_array.phpt
│   │   ├── call_user_func_array2.phpt
│   │   ├── call_with_args.phpt
│   │   ├── callback.phpt
│   │   ├── cancel/
│   │   │   ├── channel_pop.phpt
│   │   │   ├── channel_push.phpt
│   │   │   ├── error.phpt
│   │   │   ├── gethostbyname.phpt
│   │   │   ├── kill.phpt
│   │   │   ├── sleep.phpt
│   │   │   ├── socket.phpt
│   │   │   ├── suspend.phpt
│   │   │   ├── throw_exception.phpt
│   │   │   ├── wait.phpt
│   │   │   ├── wait_event.phpt
│   │   │   └── wait_signal.phpt
│   │   ├── check.phpt
│   │   ├── cid.phpt
│   │   ├── create_after_rshutdown.phpt
│   │   ├── current.phpt
│   │   ├── dead_lock.phpt
│   │   ├── defer/
│   │   │   ├── defer.phpt
│   │   │   ├── defer_close.phpt
│   │   │   ├── defer_exception.phpt
│   │   │   └── defer_in_try.phpt
│   │   ├── destruct/
│   │   │   ├── destruct1.phpt
│   │   │   ├── destruct2.phpt
│   │   │   └── destruct3.phpt
│   │   ├── dnslookup_1.phpt
│   │   ├── dnslookup_2.phpt
│   │   ├── dnslookup_3.phpt
│   │   ├── dnslookup_4.phpt
│   │   ├── dnslookup_5.phpt
│   │   ├── dnslookup_ipv6.phpt
│   │   ├── dnslookup_query_hosts.phpt
│   │   ├── empty.phpt
│   │   ├── eval.phpt
│   │   ├── exception/
│   │   │   ├── core_error.phpt
│   │   │   ├── defer1.phpt
│   │   │   ├── defer2.phpt
│   │   │   ├── dtor.phpt
│   │   │   ├── empty.phpt
│   │   │   ├── error.phpt
│   │   │   ├── error1.phpt
│   │   │   ├── error2.phpt
│   │   │   ├── error3.phpt
│   │   │   ├── fatal_error.phpt
│   │   │   ├── nested.phpt
│   │   │   ├── yield.phpt
│   │   │   └── yield1.phpt
│   │   ├── exception.phpt
│   │   ├── execute_time.phpt
│   │   ├── exists.phpt
│   │   ├── exit.phpt
│   │   ├── exit_84.phpt
│   │   ├── exit_exception_backtrace.phpt
│   │   ├── exit_exception_backtrace_84.phpt
│   │   ├── fatal_error.phpt
│   │   ├── forbidden_case/
│   │   │   ├── array_map.phpt
│   │   │   ├── call_user.phpt
│   │   │   └── invoke.phpt
│   │   ├── getContext.phpt
│   │   ├── getElasped.phpt
│   │   ├── getPcid.phpt
│   │   ├── getPcid_by_random_cid.phpt.phpt
│   │   ├── gethostbyname.phpt
│   │   ├── iterator.phpt
│   │   ├── join/
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── 6.phpt
│   │   │   ├── 7.phpt
│   │   │   └── 8.phpt
│   │   ├── kernel_coroutine.phpt
│   │   ├── list_and_backtrace.phpt
│   │   ├── max_num.phpt
│   │   ├── max_num_limit.phpt
│   │   ├── nested1.phpt
│   │   ├── nested2.phpt
│   │   ├── nested3.phpt
│   │   ├── nested_empty.phpt
│   │   ├── nested_uid.phpt
│   │   ├── new_process.phpt
│   │   ├── new_server.phpt
│   │   ├── no_inline_func.phpt
│   │   ├── output/
│   │   │   ├── concurrency.phpt
│   │   │   ├── create.phpt
│   │   │   ├── in_nested_co.phpt
│   │   │   ├── ob_main.phpt
│   │   │   └── output_control.phpt
│   │   ├── parallel1.phpt
│   │   ├── parallel2.phpt
│   │   ├── parallel3.phpt
│   │   ├── pdo_error_handing.phpt
│   │   ├── private_access.phpt
│   │   ├── resume_loop.phpt
│   │   ├── scheduler.phpt
│   │   ├── signal_listener.phpt
│   │   ├── stats.phpt
│   │   ├── timeout.phpt
│   │   ├── use_process.phpt
│   │   ├── user_coroutine.phpt
│   │   └── user_coroutine_2.phpt
│   ├── swoole_coroutine_lock/
│   │   ├── lock.phpt
│   │   ├── trylock.phpt
│   │   └── trylock2.phpt
│   ├── swoole_coroutine_scheduler/
│   │   ├── getOptions.phpt
│   │   ├── hook_flags.phpt
│   │   ├── hook_flags_2.phpt
│   │   ├── parallel.phpt
│   │   ├── preemptive/
│   │   │   ├── disable.phpt
│   │   │   ├── disable2.phpt
│   │   │   ├── do-while.phpt
│   │   │   ├── do-while2.phpt
│   │   │   ├── do-while3.phpt
│   │   │   ├── for.phpt
│   │   │   ├── for2.phpt
│   │   │   ├── goto.phpt
│   │   │   ├── goto2.phpt
│   │   │   ├── timer.phpt
│   │   │   ├── while.phpt
│   │   │   ├── while2.phpt
│   │   │   └── while3.phpt
│   │   ├── repeat.phpt
│   │   ├── resume1.phpt
│   │   ├── resume2.phpt
│   │   ├── resume3.phpt
│   │   ├── resume4.phpt
│   │   ├── resume5.phpt
│   │   ├── resume6.phpt
│   │   ├── start.phpt
│   │   ├── start_in_server_shutdown.phpt
│   │   └── start_in_server_worker_stop.phpt
│   ├── swoole_coroutine_system/
│   │   ├── aio_thread_num.phpt
│   │   ├── getaddrinfo.phpt
│   │   ├── getaddrinfo_timeout.phpt
│   │   ├── gethostbyname.phpt
│   │   ├── gethostbyname_ipv6.phpt
│   │   ├── gethostbyname_timeout.phpt
│   │   ├── readfile.phpt
│   │   ├── sleep.phpt
│   │   ├── wait.phpt
│   │   ├── waitEvent.phpt
│   │   ├── waitPid.phpt
│   │   ├── waitSignal.phpt
│   │   ├── waitSignal_2.phpt
│   │   ├── writefile.phpt
│   │   └── writefile_append.phpt
│   ├── swoole_coroutine_util/
│   │   ├── dns_lookup.phpt
│   │   ├── exec.phpt
│   │   ├── exec_sleep.phpt
│   │   ├── fgets.phpt
│   │   ├── fread.phpt
│   │   ├── fwrite.phpt
│   │   ├── list_coroutine.phpt
│   │   └── task_worker.phpt
│   ├── swoole_coroutine_wait_group/
│   │   ├── base.phpt
│   │   ├── defer.phpt
│   │   ├── empty.phpt
│   │   └── logic.phpt
│   ├── swoole_curl/
│   │   ├── abnormal_response/
│   │   │   ├── 1.phpt
│   │   │   └── 2.phpt
│   │   ├── basic/
│   │   │   ├── 1.phpt
│   │   │   ├── 10.phpt
│   │   │   ├── 11.phpt
│   │   │   ├── 12.phpt
│   │   │   ├── 13.phpt
│   │   │   ├── 14.phpt
│   │   │   ├── 15.phpt
│   │   │   ├── 19.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 20.phpt
│   │   │   ├── 21.phpt
│   │   │   ├── 22.phpt
│   │   │   ├── 23.phpt
│   │   │   ├── 24.phpt
│   │   │   ├── 25.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── 7.phpt
│   │   │   ├── 8.phpt
│   │   │   └── 9.phpt
│   │   ├── cancel.phpt
│   │   ├── close_before_resume.phpt
│   │   ├── concurrent.phpt
│   │   ├── coro_read.phpt
│   │   ├── coro_write.phpt
│   │   ├── coro_write_header.phpt
│   │   ├── error.phpt
│   │   ├── event_exit.phpt
│   │   ├── exec_twice.phpt
│   │   ├── fatal_error_in_callback.phpt
│   │   ├── ftp.phpt
│   │   ├── guzzle/
│   │   │   ├── cancel.phpt
│   │   │   ├── cannot_cancel_finished.phpt
│   │   │   ├── cookie.phpt
│   │   │   ├── promise.phpt
│   │   │   ├── request_async.phpt
│   │   │   ├── request_on_stats.phpt
│   │   │   └── send_async.phpt
│   │   ├── guzzle.phpt
│   │   ├── https.phpt
│   │   ├── keepalive.phpt
│   │   ├── multi/
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── 6.phpt
│   │   │   ├── add_after_easy_exec.phpt
│   │   │   ├── bug4393.phpt
│   │   │   ├── bug48203_multi.phpt
│   │   │   ├── bug67643.phpt
│   │   │   ├── bug71523.phpt
│   │   │   ├── bug76675.phpt
│   │   │   ├── bug77535.phpt
│   │   │   ├── bug77946.phpt
│   │   │   ├── close.phpt
│   │   │   ├── curl_basic_018.phpt
│   │   │   ├── curl_copy_handle_variation4.phpt
│   │   │   ├── curl_int_cast.phpt
│   │   │   ├── curl_multi_close_basic.phpt
│   │   │   ├── curl_multi_close_basic001.phpt
│   │   │   ├── curl_multi_close_reference.phpt
│   │   │   ├── curl_multi_errno_strerror_001.phpt
│   │   │   ├── curl_multi_getcontent_basic3.phpt
│   │   │   ├── curl_multi_info_read.phpt
│   │   │   ├── curl_multi_init_basic.phpt
│   │   │   ├── curl_multi_segfault.phpt
│   │   │   ├── curl_multi_select_basic1.phpt
│   │   │   ├── curl_multi_setopt_basic001.phpt
│   │   │   ├── dtor.phpt
│   │   │   ├── multiple_binding.phpt
│   │   │   ├── no_hook.phpt
│   │   │   ├── select_cancel.phpt
│   │   │   ├── select_timeout.phpt
│   │   │   └── select_twice.phpt
│   │   ├── non_exclusive.phpt
│   │   ├── setopt/
│   │   │   ├── 1.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5_skip.phpt
│   │   │   ├── filetime_1.phpt
│   │   │   ├── filetime_2.phpt
│   │   │   ├── header_out.phpt
│   │   │   ├── infile.phpt
│   │   │   └── nobody.phpt
│   │   ├── share/
│   │   │   ├── 1.phpt
│   │   │   └── 5.phpt
│   │   ├── sleep.phpt
│   │   ├── ssl/
│   │   │   └── version.phpt
│   │   ├── symfony-noco.phpt
│   │   ├── symfony.phpt
│   │   ├── template
│   │   ├── timer_coredump.phpt
│   │   ├── undefined_behavior/
│   │   │   ├── 0.phpt
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── 6.phpt
│   │   │   ├── 7.phpt
│   │   │   └── 8.phpt
│   │   ├── upload/
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── curl_testdata1.txt
│   │   │   └── curl_testdata2.txt
│   │   └── yield_in_callback.phpt
│   ├── swoole_event/
│   │   ├── add_after_server_start.phpt
│   │   ├── cycle.phpt
│   │   ├── defer.phpt
│   │   ├── defer_with_sleep.phpt
│   │   ├── defer_without_io.phpt
│   │   ├── del.phpt
│   │   ├── del_after_close.phpt
│   │   ├── deprecated_event_wait.phpt
│   │   ├── dispatch.phpt
│   │   ├── function_alias.phpt
│   │   ├── isset.phpt
│   │   ├── kqueue.phpt
│   │   ├── rshutdown.phpt
│   │   ├── set.phpt
│   │   ├── simple.phpt
│   │   ├── sockets.phpt
│   │   ├── sync_client_1.phpt
│   │   ├── sync_client_2.phpt
│   │   ├── wait.phpt
│   │   └── write.phpt
│   ├── swoole_feature/
│   │   ├── cross_close/
│   │   │   ├── client.phpt
│   │   │   ├── client_by_server.phpt
│   │   │   ├── full_duplex.phpt
│   │   │   ├── full_duplex_by_server.phpt
│   │   │   ├── http.phpt
│   │   │   ├── http_by_server.phpt
│   │   │   ├── php_stream_full_duplex.phpt
│   │   │   ├── php_stream_full_duplex_by_server.phpt
│   │   │   ├── redis.phpt
│   │   │   ├── redis_by_server.phpt
│   │   │   ├── stream.phpt
│   │   │   └── stream_by_server.phpt
│   │   └── full_duplex/
│   │       ├── client.phpt
│   │       ├── socket.phpt
│   │       ├── socket_ssl.phpt
│   │       └── websocket.phpt
│   ├── swoole_ftp/
│   │   ├── 001.phpt
│   │   ├── 002.phpt
│   │   ├── 003.phpt
│   │   ├── 004.phpt
│   │   ├── 005.phpt
│   │   ├── 007.phpt
│   │   ├── bug27809.phpt
│   │   ├── bug37799.phpt
│   │   ├── bug39458-2.phpt
│   │   ├── bug39458.phpt
│   │   ├── bug39583-2.phpt
│   │   ├── bug39583.phpt
│   │   ├── bug7216-2.phpt
│   │   ├── bug7216.phpt
│   │   ├── bug79100.phpt
│   │   ├── bug80901.phpt
│   │   ├── cert.pem
│   │   ├── dead-resource.phpt
│   │   ├── filesize_large.phpt
│   │   ├── ftp_alloc_basic1.phpt
│   │   ├── ftp_alloc_basic2.phpt
│   │   ├── ftp_append.phpt
│   │   ├── ftp_chmod_basic.phpt
│   │   ├── ftp_connect_001.phpt
│   │   ├── ftp_constructor.phpt
│   │   ├── ftp_delete.phpt
│   │   ├── ftp_exec_basic.phpt
│   │   ├── ftp_fget_basic.phpt
│   │   ├── ftp_fget_basic1.phpt
│   │   ├── ftp_fget_basic2.phpt
│   │   ├── ftp_fget_basic3.phpt
│   │   ├── ftp_fput.phpt
│   │   ├── ftp_fput_ascii_over_4_kib.phpt
│   │   ├── ftp_get_basic.phpt
│   │   ├── ftp_get_option.phpt
│   │   ├── ftp_mdtm_basic.phpt
│   │   ├── ftp_mlsd.phpt
│   │   ├── ftp_mlsd_empty_directory.phpt
│   │   ├── ftp_mlsd_missing_directory.phpt
│   │   ├── ftp_nb_continue.phpt
│   │   ├── ftp_nb_fget_basic1.phpt
│   │   ├── ftp_nb_fget_basic2.phpt
│   │   ├── ftp_nb_fget_basic3.phpt
│   │   ├── ftp_nb_fput.phpt
│   │   ├── ftp_nb_get_large.phpt
│   │   ├── ftp_nb_put.phpt
│   │   ├── ftp_pasv.phpt
│   │   ├── ftp_rawlist_basic1.phpt
│   │   ├── ftp_rawlist_basic2.phpt
│   │   ├── ftp_rename_basic1.phpt
│   │   ├── ftp_rmdir_basic.phpt
│   │   ├── ftp_set_option.phpt
│   │   ├── ftp_set_option_errors.phpt
│   │   ├── ftp_site_basic.phpt
│   │   ├── ftp_ssl_connect_error.phpt
│   │   ├── gh10521.phpt
│   │   ├── gh10562.phpt
│   │   └── server.inc
│   ├── swoole_function/
│   │   ├── substr_json_decode.phpt
│   │   ├── substr_unserialize.phpt
│   │   ├── swoole_clear_dns_cache.phpt
│   │   ├── swoole_cpu_num.phpt
│   │   ├── swoole_error_log.phpt
│   │   ├── swoole_get_local_ip.phpt
│   │   ├── swoole_get_local_mac.phpt
│   │   ├── swoole_set_process_name.phpt
│   │   ├── swoole_strerror.phpt
│   │   └── swoole_version.phpt
│   ├── swoole_global/
│   │   ├── channel_construct_check.phpt
│   │   ├── closed_stdout.phpt
│   │   ├── create_deny.phpt
│   │   ├── function_alias.phpt
│   │   ├── serialize_deny.phpt
│   │   ├── socket_construct_check.phpt
│   │   ├── too_many_objects.phpt
│   │   ├── unset_deny.phpt
│   │   ├── unset_property_01.phpt
│   │   ├── unset_property_02.phpt
│   │   └── unset_property_03.phpt
│   ├── swoole_http2_client_coro/
│   │   ├── bug_5127.phpt
│   │   ├── connect_twice.phpt
│   │   ├── cookies.phpt
│   │   ├── error.phpt
│   │   ├── goaway.phpt
│   │   ├── headers.phpt
│   │   ├── host.phpt
│   │   ├── http_proxy.phpt
│   │   ├── huge_headers.phpt
│   │   ├── issues_2374.phpt
│   │   ├── max-frame-size.phpt
│   │   ├── multi.phpt
│   │   ├── no-gzip.phpt
│   │   ├── number.phpt
│   │   ├── ping.phpt
│   │   ├── pipeline.phpt
│   │   ├── post.phpt
│   │   ├── send-cookies.phpt
│   │   ├── send_only_bug.phpt
│   │   ├── set-cookies.phpt
│   │   ├── sock_type_unix.phpt
│   │   └── wrong_headers.phpt
│   ├── swoole_http2_server/
│   │   ├── 413.phpt
│   │   ├── big_data.phpt
│   │   ├── compression.phpt
│   │   ├── compression_types.phpt
│   │   ├── getMethod.phpt
│   │   ├── goaway.phpt
│   │   ├── http2_headers.phpt
│   │   ├── issue_4365.phpt
│   │   ├── max_concurrency.phpt
│   │   ├── nghttp2_big_data.phpt
│   │   ├── no_compression.phpt
│   │   ├── ping.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendfile_content_type.phpt
│   │   ├── sendfile_set_content_type.phpt
│   │   ├── server_addr.phpt
│   │   ├── static_handler.phpt
│   │   ├── streaming.phpt
│   │   ├── streaming_2.phpt
│   │   ├── trailer.phpt
│   │   └── worker_max_concurrency.phpt
│   ├── swoole_http2_server_coro/
│   │   └── cookies.phpt
│   ├── swoole_http_client_coro/
│   │   ├── 204.phpt
│   │   ├── addData.phpt
│   │   ├── alias.phpt
│   │   ├── another_coroutine.phpt
│   │   ├── auto_reconnect.phpt
│   │   ├── bind_address.phpt
│   │   ├── bug_2661.phpt
│   │   ├── bug_3118.phpt
│   │   ├── compression_with_big_data.phpt
│   │   ├── connect_timeout.phpt
│   │   ├── connection_close.phpt
│   │   ├── construct_failed.phpt
│   │   ├── cookies_set_bug.phpt
│   │   ├── defer.phpt
│   │   ├── defer_02.phpt
│   │   ├── disable_keep_alive.phpt
│   │   ├── download.phpt
│   │   ├── download_302.phpt
│   │   ├── download_failed.phpt
│   │   ├── download_filename_bug.phpt
│   │   ├── duplicate_header.phpt
│   │   ├── error_handler.phpt
│   │   ├── get.phpt
│   │   ├── get_header_out_after_close.phpt
│   │   ├── get_twice.phpt
│   │   ├── get_twice_keepalive.phpt
│   │   ├── get_without_content_length.phpt
│   │   ├── h2c_upgrade.phpt
│   │   ├── head_method.phpt
│   │   ├── host.phpt
│   │   ├── http_chunk.phpt
│   │   ├── http_proxy.phpt
│   │   ├── http_proxy_443.phpt
│   │   ├── http_proxy_with_host_port.phpt
│   │   ├── http_upload_big.phpt
│   │   ├── https.phpt
│   │   ├── https_upload_big.phpt
│   │   ├── issue_2664.phpt
│   │   ├── keep_alive.phpt
│   │   ├── long_domain.phpt
│   │   ├── lowercase_header.phpt
│   │   ├── multi.phpt
│   │   ├── multi_and_reuse.phpt
│   │   ├── parser.phpt
│   │   ├── post_array.phpt
│   │   ├── reconnect_but_failed.phpt
│   │   ├── recv_slow_timeout.phpt
│   │   ├── recv_timeout.phpt
│   │   ├── set_basic_auth.phpt
│   │   ├── slow_server.phpt
│   │   ├── socks5_proxy.phpt
│   │   ├── socks5_proxy_ipv6.phpt
│   │   ├── ssl.phpt
│   │   ├── ssl_host_name.phpt
│   │   ├── ssl_verify_peer_1.phpt
│   │   ├── ssl_verify_peer_2.phpt
│   │   ├── timeout_before_connect.phpt
│   │   ├── timeout_when_recv.phpt
│   │   ├── unixsocket.phpt
│   │   ├── upload.phpt
│   │   ├── upload_huge.phpt
│   │   ├── upload_with_null_args.phpt
│   │   ├── websocket/
│   │   │   ├── 1.phpt
│   │   │   ├── auto_pong.phpt
│   │   │   ├── bug_01.phpt
│   │   │   ├── bug_02.phpt
│   │   │   ├── close_socket.phpt
│   │   │   ├── continue_frame_finish_flag.phpt
│   │   │   ├── continue_frame_finish_flag2.phpt
│   │   │   ├── continue_frames.phpt
│   │   │   ├── continue_frames2.phpt
│   │   │   ├── continue_frames3.phpt
│   │   │   ├── continue_frames4.phpt
│   │   │   ├── control_frame_compress.phpt
│   │   │   ├── control_frame_fragmented.phpt
│   │   │   ├── disconnect.phpt
│   │   │   ├── open_websocket_frame.phpt
│   │   │   ├── ping.phpt
│   │   │   ├── priority.phpt
│   │   │   ├── priority1.phpt
│   │   │   ├── send_more_continue_frame.phpt
│   │   │   ├── send_more_continue_frame2.phpt
│   │   │   ├── server_push_first.phpt
│   │   │   ├── ssl_1.phpt
│   │   │   ├── ssl_2.phpt
│   │   │   ├── timeout.phpt
│   │   │   └── upgrade_after_get.phpt
│   │   ├── write_func_1.phpt
│   │   └── write_func_2.phpt
│   ├── swoole_http_server/
│   │   ├── 0.phpt
│   │   ├── 100-continue.phpt
│   │   ├── If_Modified_Since.phpt
│   │   ├── accept_encoding.phpt
│   │   ├── buffer_output_size.phpt
│   │   ├── bug_2368.phpt
│   │   ├── bug_2444.phpt
│   │   ├── bug_2608.phpt
│   │   ├── bug_2751.phpt
│   │   ├── bug_2786.phpt
│   │   ├── bug_2947.phpt
│   │   ├── bug_2988.phpt
│   │   ├── bug_4261.phpt
│   │   ├── bug_4857.phpt
│   │   ├── bug_5107.phpt
│   │   ├── bug_5114.phpt
│   │   ├── bug_5146.phpt
│   │   ├── bug_5186.phpt
│   │   ├── bug_6007.phpt
│   │   ├── bug_compression_level.phpt
│   │   ├── bug_get_request_data_after_end.phpt
│   │   ├── callback_new_obj_method.phpt
│   │   ├── callback_new_static_method.phpt
│   │   ├── callback_string.phpt
│   │   ├── callback_with_internal_function.phpt
│   │   ├── callback_with_private.phpt
│   │   ├── callback_with_protected.phpt
│   │   ├── chunk.phpt
│   │   ├── chunk_with_end_data.phpt
│   │   ├── chunked_pipeline_request.phpt
│   │   ├── client_ca.phpt
│   │   ├── client_compress.phpt
│   │   ├── co_switching.phpt
│   │   ├── compression.phpt
│   │   ├── compression_min_length.phpt
│   │   ├── compression_types.phpt
│   │   ├── cookieAlias.phpt
│   │   ├── cookie_delete.phpt
│   │   ├── cookie_samesite.phpt
│   │   ├── cookie_vs_rawcookie.phpt
│   │   ├── cookies.phpt
│   │   ├── cookies_parse.phpt
│   │   ├── create_request.phpt
│   │   ├── data_parse.phpt
│   │   ├── disable_compression.phpt
│   │   ├── disable_coroutine.phpt
│   │   ├── dispatch_mode_7.phpt
│   │   ├── duplicate_header.phpt
│   │   ├── enable_coroutine.phpt
│   │   ├── error_1203.phpt
│   │   ├── error_413.phpt
│   │   ├── event_stream.phpt
│   │   ├── event_stream2.phpt
│   │   ├── form_data_1.phpt
│   │   ├── form_data_with_charset.phpt
│   │   ├── head_method.phpt
│   │   ├── headers_sent.phpt
│   │   ├── headers_sent_coroutine.phpt
│   │   ├── http_autoindex.phpt
│   │   ├── http_index_files.phpt
│   │   ├── http_index_files_autoindex.phpt
│   │   ├── https.phpt
│   │   ├── issue_2360.phpt
│   │   ├── json_encode.phpt
│   │   ├── json_encode2.phpt
│   │   ├── large_url.phpt
│   │   ├── max-age.phpt
│   │   ├── max_concurrency.phpt
│   │   ├── max_coro_num.phpt
│   │   ├── max_execution_time.phpt
│   │   ├── max_input_vars.phpt
│   │   ├── mixed_server.phpt
│   │   ├── new_cookie.phpt
│   │   ├── no_compression.phpt
│   │   ├── numeric_header_name.phpt
│   │   ├── objectCookie.phpt
│   │   ├── objectCookieMemory.phpt
│   │   ├── octane_bug_651.phpt
│   │   ├── pipeline.phpt
│   │   ├── post.phpt
│   │   ├── purge_method.phpt
│   │   ├── range.phpt
│   │   ├── range2.phpt
│   │   ├── rawContent.phpt
│   │   ├── rawCookie.phpt
│   │   ├── redirect.phpt
│   │   ├── reset_concurrency_with_base.phpt
│   │   ├── reset_concurrency_with_process.phpt
│   │   ├── response_create.phpt
│   │   ├── send_500_to_client.phpt
│   │   ├── send_empty_file.phpt
│   │   ├── send_yield.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendfile_client_reset.phpt
│   │   ├── sendfile_dir.phpt
│   │   ├── sendfile_link.phpt
│   │   ├── sendfile_no_keepalive.phpt
│   │   ├── sendfile_with_dispatch_mode_7.phpt
│   │   ├── sendfile_with_ssl.phpt
│   │   ├── server_addr.phpt
│   │   ├── server_addr2.phpt
│   │   ├── set_content_length.phpt
│   │   ├── shutdown_in_event_worker.phpt
│   │   ├── shutdown_in_task_worker.phpt
│   │   ├── slow_client.phpt
│   │   ├── slow_large_post.phpt
│   │   ├── sni/
│   │   │   └── server.phpt
│   │   ├── static_handler/
│   │   │   ├── locations.phpt
│   │   │   ├── mimetype_not_exists.phpt
│   │   │   ├── read_link_2.phpt
│   │   │   ├── read_link_file.phpt
│   │   │   ├── relative_path.phpt
│   │   │   ├── relative_path_2.phpt
│   │   │   ├── relative_path_3.phpt
│   │   │   └── urldecode.phpt
│   │   ├── static_handler.phpt
│   │   ├── task/
│   │   │   ├── enable_coroutine.phpt
│   │   │   ├── enable_coroutine_with_wrong_usage.phpt
│   │   │   └── use_object.phpt
│   │   ├── tmp-content-type.phpt
│   │   ├── too_many_special_chars_in_cookie.phpt
│   │   ├── trailer.phpt
│   │   ├── unixsocket.phpt
│   │   ├── unixsocket2.phpt
│   │   ├── unset_response_header.phpt
│   │   ├── upload.phpt
│   │   ├── upload4.phpt
│   │   ├── uploadFile.phpt
│   │   ├── upload_02.phpt
│   │   ├── upload_03.phpt
│   │   ├── upload_big_file.phpt
│   │   ├── upload_file_array_default.phpt
│   │   ├── upload_file_array_parsed.phpt
│   │   ├── upload_file_empty.phpt
│   │   ├── upload_max_filesize.phpt
│   │   ├── url_rewrite.phpt
│   │   ├── worker_max_concurrency.phpt
│   │   └── zstd.phpt
│   ├── swoole_http_server_coro/
│   │   ├── bad_request.phpt
│   │   ├── buffer_clear.phpt
│   │   ├── bug_2682.phpt
│   │   ├── bug_3025.phpt
│   │   ├── bug_4519.phpt
│   │   ├── bug_no_handle.phpt
│   │   ├── check_cookie_crlf.phpt
│   │   ├── check_http_header_crlf.phpt
│   │   ├── chunked_pipeline_request.phpt
│   │   ├── close_socket.phpt
│   │   ├── compress_continue_frames.phpt
│   │   ├── compression_min_length.phpt
│   │   ├── compression_types.phpt
│   │   ├── continue_frames.phpt
│   │   ├── continue_frames2.phpt
│   │   ├── continue_frames3.phpt
│   │   ├── continue_frames4.phpt
│   │   ├── control_frame_compress.phpt
│   │   ├── control_frame_fragmented.phpt
│   │   ├── crash-bad-return-type.phpt
│   │   ├── create_response.phpt
│   │   ├── create_response_2.phpt
│   │   ├── disconnect.phpt
│   │   ├── error_404.phpt
│   │   ├── error_413.phpt
│   │   ├── form_data_1.phpt
│   │   ├── form_data_2.phpt
│   │   ├── graceful_shutdown.phpt
│   │   ├── handle.phpt
│   │   ├── http2.phpt
│   │   ├── http2_ssl.phpt
│   │   ├── https.phpt
│   │   ├── ipv6.phpt
│   │   ├── keepalive.phpt
│   │   ├── open_frame.phpt
│   │   ├── ping.phpt
│   │   ├── pipeline.phpt
│   │   ├── post_array.phpt
│   │   ├── random_port.phpt
│   │   ├── rawContent_get_big_data.phpt
│   │   ├── remote_addr.phpt
│   │   ├── restart.phpt
│   │   ├── reuse_port.phpt
│   │   ├── sendfile.phpt
│   │   ├── server_addr.phpt
│   │   ├── slow_client.phpt
│   │   ├── slow_large_post.phpt
│   │   ├── ssl_bad_client.phpt
│   │   ├── tcp_nodelay.phpt
│   │   ├── upload.phpt
│   │   ├── websocket.phpt
│   │   ├── websocket_close.phpt
│   │   ├── websocket_compression.phpt
│   │   ├── websocket_mixed.phpt
│   │   ├── websocket_ping.phpt
│   │   └── websocket_ping_pong.phpt
│   ├── swoole_iouring/
│   │   ├── mix.phpt
│   │   └── setting.phpt
│   ├── swoole_library/
│   │   ├── array_object/
│   │   │   └── base.phpt
│   │   ├── database/
│   │   │   ├── mysqli.phpt
│   │   │   ├── pdo.phpt
│   │   │   └── redis.phpt
│   │   ├── exec/
│   │   │   ├── exec/
│   │   │   │   ├── 1.phpt
│   │   │   │   └── 2.phpt
│   │   │   └── shell_exec/
│   │   │       └── 1.phpt
│   │   ├── multibyte_string_object/
│   │   │   └── base.phpt
│   │   ├── name_resolver/
│   │   │   ├── 1.phpt
│   │   │   └── lookup.phpt
│   │   ├── string_object/
│   │   │   └── base.phpt
│   │   └── wait_group/
│   │       ├── normal.phpt
│   │       └── timeout.phpt
│   ├── swoole_lock/
│   │   ├── bug_5984.phpt
│   │   ├── lock_nb.phpt
│   │   ├── lock_read.phpt
│   │   ├── lock_timeout.phpt
│   │   ├── mutex.phpt
│   │   └── spinlock_timeout.phpt
│   ├── swoole_pdo_firebird/
│   │   ├── base.phpt
│   │   ├── pdo_firebird.inc
│   │   ├── query.phpt
│   │   ├── sleep.phpt
│   │   └── transaction.phpt
│   ├── swoole_pdo_odbc/
│   │   ├── base.phpt
│   │   ├── blocking.phpt
│   │   ├── query.phpt
│   │   ├── race.phpt
│   │   ├── server_info.phpt
│   │   ├── sleep.phpt
│   │   └── transaction.phpt
│   ├── swoole_pdo_oracle/
│   │   ├── bug41996.phpt
│   │   ├── bug44301.phpt
│   │   ├── bug46274.phpt
│   │   ├── bug46274_2.phpt
│   │   ├── bug54379.phpt
│   │   ├── bug57702.phpt
│   │   ├── bug60994.phpt
│   │   ├── bug_33707.phpt
│   │   ├── checkliveness.phpt
│   │   ├── coroutint.phpt
│   │   ├── oci_success_with_info.phpt
│   │   ├── pdo_oci_attr_action.phpt
│   │   ├── pdo_oci_attr_autocommit_1.phpt
│   │   ├── pdo_oci_attr_autocommit_2.phpt
│   │   ├── pdo_oci_attr_autocommit_3.phpt
│   │   ├── pdo_oci_attr_call_timeout.phpt
│   │   ├── pdo_oci_attr_case.phpt
│   │   ├── pdo_oci_attr_client.phpt
│   │   ├── pdo_oci_attr_client_identifier.phpt
│   │   ├── pdo_oci_attr_client_info.phpt
│   │   ├── pdo_oci_attr_drivername.phpt
│   │   ├── pdo_oci_attr_module.phpt
│   │   ├── pdo_oci_attr_nulls_1.phpt
│   │   ├── pdo_oci_attr_prefetch_1.phpt
│   │   ├── pdo_oci_attr_prefetch_2.phpt
│   │   ├── pdo_oci_attr_server.phpt
│   │   ├── pdo_oci_class_constants.phpt
│   │   ├── pdo_oci_debugdumpparams.phpt
│   │   ├── pdo_oci_fread_1.phpt
│   │   ├── pdo_oci_phpinfo.phpt
│   │   ├── pdo_oci_quote1.phpt
│   │   ├── pdo_oci_stmt_getcolumnmeta.phpt
│   │   ├── pdo_oci_stream_1.phpt
│   │   ├── pdo_oci_stream_2.phpt
│   │   ├── pdo_oci_templob_1.phpt
│   │   ├── pdo_oracle.inc
│   │   ├── pecl_bug_11345.phpt
│   │   ├── pecl_bug_6364.phpt
│   │   ├── transcation.phpt
│   │   └── transcation2.phpt
│   ├── swoole_pdo_pgsql/
│   │   ├── base.phpt
│   │   ├── blocking.phpt
│   │   ├── bug_5635.phpt
│   │   ├── libpq_version.phpt
│   │   ├── pdo_pgsql.inc
│   │   ├── query.phpt
│   │   ├── race.phpt
│   │   ├── sleep.phpt
│   │   └── transaction.phpt
│   ├── swoole_pdo_sqlite/
│   │   ├── bug33841.phpt
│   │   ├── bug35336.phpt
│   │   ├── bug38334.phpt
│   │   ├── bug43831.phpt
│   │   ├── bug44327_2_1.phpt
│   │   ├── bug44327_2_2.phpt
│   │   ├── bug44327_3_1.phpt
│   │   ├── bug44327_3_2.phpt
│   │   ├── bug46139.phpt
│   │   ├── bug46542.phpt
│   │   ├── bug48773.phpt
│   │   ├── bug50728.phpt
│   │   ├── bug52487.phpt
│   │   ├── bug66033.phpt
│   │   ├── bug70862.phpt
│   │   ├── bug70862_1.phpt
│   │   ├── bug78192_1.phpt
│   │   ├── bug78192_2.phpt
│   │   ├── bug79664_1.phpt
│   │   ├── bug79664_2.phpt
│   │   ├── bug81740.phpt
│   │   ├── bug_42589.phpt
│   │   ├── bug_44159_sqlite_version_1.phpt
│   │   ├── bug_44159_sqlite_version_2.phpt
│   │   ├── bug_47769.phpt
│   │   ├── bug_63916-2.phpt
│   │   ├── bug_63916_1.phpt
│   │   ├── bug_63916_2.phpt
│   │   ├── bug_64705.phpt
│   │   ├── coroutine.phpt
│   │   ├── coroutine2.phpt
│   │   ├── debugdumpparams_001.phpt
│   │   ├── gh9032.phpt
│   │   ├── open_basedir.phpt
│   │   ├── pdo_035.phpt
│   │   ├── pdo_fetch_func_001.phpt
│   │   ├── pdo_fetch_func_001_1.phpt
│   │   ├── pdo_sqlite.inc
│   │   ├── pdo_sqlite_extendederror_attr.phpt
│   │   ├── pdo_sqlite_filename_uri.phpt
│   │   ├── pdo_sqlite_get_attribute.phpt
│   │   ├── pdo_sqlite_lastinsertid.phpt
│   │   ├── pdo_sqlite_open_flags.phpt
│   │   ├── pdo_sqlite_statement_getattribute.phpt
│   │   ├── pdo_sqlite_tostring_exception.phpt
│   │   └── pdo_sqlite_transaction.phpt
│   ├── swoole_process/
│   │   ├── alarm.phpt
│   │   ├── close.phpt
│   │   ├── coro/
│   │   │   ├── ipc.phpt
│   │   │   ├── set_protocol.phpt
│   │   │   ├── signal.phpt
│   │   │   └── start.phpt
│   │   ├── ctor.phpt
│   │   ├── daemon.phpt
│   │   ├── deamon.phpt
│   │   ├── echo.py
│   │   ├── enable_coroutine.phpt
│   │   ├── exception.phpt
│   │   ├── exec.phpt
│   │   ├── exit.phpt
│   │   ├── freeQueue.phpt
│   │   ├── getaffinity.phpt
│   │   ├── ignore_sigpipe.phpt
│   │   ├── ignore_sigpipe_2.phpt
│   │   ├── kill.phpt
│   │   ├── msgq_capacity.phpt
│   │   ├── name.phpt
│   │   ├── null_callback.phpt
│   │   ├── pop.phpt
│   │   ├── priority.phpt
│   │   ├── priority_error.phpt
│   │   ├── process_exec.phpt
│   │   ├── process_id.phpt
│   │   ├── process_msgqueue.phpt
│   │   ├── process_push.phpt
│   │   ├── process_select.phpt
│   │   ├── push.phpt
│   │   ├── read.phpt
│   │   ├── redirect.phpt
│   │   ├── setaffinity.phpt
│   │   ├── signal.phpt
│   │   ├── signal_in_manager.phpt
│   │   ├── signal_in_manager_2.phpt
│   │   ├── signal_in_manager_3.phpt
│   │   ├── signal_in_task_worker.phpt
│   │   ├── signal_twice.phpt
│   │   ├── start.phpt
│   │   ├── timeout.phpt
│   │   ├── useQueue.phpt
│   │   ├── wait.phpt
│   │   ├── wait_signal.phpt
│   │   ├── write.phpt
│   │   └── write_in_worker.phpt
│   ├── swoole_process_pool/
│   │   ├── bug_2652.phpt
│   │   ├── create_websocket_server.phpt
│   │   ├── detach.phpt
│   │   ├── enable_coroutine.phpt
│   │   ├── enable_coroutine2.phpt
│   │   ├── export_socket.phpt
│   │   ├── getprocess_1.phpt
│   │   ├── getprocess_2.phpt
│   │   ├── getprocess_3.phpt
│   │   ├── getprocess_4.phpt
│   │   ├── getprocess_5.phpt
│   │   ├── master_callback.phpt
│   │   ├── master_pid.phpt
│   │   ├── max_wait_time.phpt
│   │   ├── message.phpt
│   │   ├── message_async.phpt
│   │   ├── message_bus.phpt
│   │   ├── message_bus_sync.phpt
│   │   ├── msgqueue.phpt
│   │   ├── msgqueue_2.phpt
│   │   ├── reload.phpt
│   │   ├── reuse_port.phpt
│   │   ├── shutdown.phpt
│   │   ├── socket_coro.phpt
│   │   ├── start_pool_twice_in_same_process.phpt
│   │   ├── start_twice.phpt
│   │   └── worker_exit_1.phpt
│   ├── swoole_redis_server/
│   │   ├── big_packet.phpt
│   │   ├── empty.phpt
│   │   ├── format.phpt
│   │   ├── getHandler.phpt
│   │   ├── large_data_map.phpt
│   │   └── nested_map.phpt
│   ├── swoole_runtime/
│   │   ├── accept.phpt
│   │   ├── accept_timeout.phpt
│   │   ├── async_protocol.phpt
│   │   ├── base.phpt
│   │   ├── bindto.phpt
│   │   ├── bindto2.phpt
│   │   ├── block.phpt
│   │   ├── bug_4657.phpt
│   │   ├── bug_5104.phpt
│   │   ├── cancel_sleep.phpt
│   │   ├── destruct.phpt
│   │   ├── enable_crypto.phpt
│   │   ├── exec/
│   │   │   └── exec.phpt
│   │   ├── file_hook/
│   │   │   ├── a.inc
│   │   │   ├── async_file.phpt
│   │   │   ├── b.inc
│   │   │   ├── bug_4327.phpt
│   │   │   ├── bug_ftell_2g.phpt
│   │   │   ├── bug_scandir.phpt
│   │   │   ├── fgets.phpt
│   │   │   ├── flock.phpt
│   │   │   ├── fread.phpt
│   │   │   ├── include.phpt
│   │   │   ├── include_2.phpt
│   │   │   ├── lock_ex.phpt
│   │   │   ├── lock_nb_1.phpt
│   │   │   ├── lock_nb_2.phpt
│   │   │   ├── lock_sh.phpt
│   │   │   ├── open_basedir.phpt
│   │   │   ├── read.phpt
│   │   │   └── readdir.phpt
│   │   ├── file_lock/
│   │   │   ├── async_file.phpt
│   │   │   ├── lock_ex.phpt
│   │   │   ├── lock_nb.phpt
│   │   │   └── lock_sh_1.phpt
│   │   ├── ftp_fopen_wrapper.phpt
│   │   ├── get_hook_flags.phpt
│   │   ├── gethostbyname.phpt
│   │   ├── hook_default.phpt
│   │   ├── hook_enable_coroutine.phpt
│   │   ├── hook_set_flags.phpt
│   │   ├── library.phpt
│   │   ├── nonblock.phpt
│   │   ├── out_of_coroutine.phpt
│   │   ├── pdo.phpt
│   │   ├── persistent.phpt
│   │   ├── proc/
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── close_after_wait.phpt
│   │   │   └── proc_open_pipes.inc
│   │   ├── redis_connect.phpt
│   │   ├── redis_pconnect.phpt
│   │   ├── remote_object/
│   │   │   └── dns.phpt
│   │   ├── sento.phpt
│   │   ├── set_hook_flags.phpt
│   │   ├── sleep.phpt
│   │   ├── sleep_yield.phpt
│   │   ├── sockets/
│   │   │   ├── basic/
│   │   │   │   ├── bug46360.phpt
│   │   │   │   ├── bug49341.phpt
│   │   │   │   ├── bug63000.phpt
│   │   │   │   ├── bug76839.phpt
│   │   │   │   ├── ipv4loop.phpt
│   │   │   │   ├── ipv6_skipif.inc
│   │   │   │   ├── ipv6loop.phpt
│   │   │   │   ├── mcast_helpers.php.inc
│   │   │   │   ├── mcast_ipv4_recv.phpt
│   │   │   │   ├── mcast_ipv4_send.phpt
│   │   │   │   ├── mcast_ipv4_send_error.phpt
│   │   │   │   ├── mcast_ipv6_recv.phpt
│   │   │   │   ├── mcast_ipv6_recv_limited.phpt
│   │   │   │   ├── mcast_ipv6_send.phpt
│   │   │   │   ├── socket_accept_failure.phpt
│   │   │   │   ├── socket_bind.phpt
│   │   │   │   ├── socket_clear_error.phpt
│   │   │   │   ├── socket_connect_params.phpt
│   │   │   │   ├── socket_create_listen-nobind.phpt
│   │   │   │   ├── socket_create_listen.phpt
│   │   │   │   ├── socket_create_listen_used.phpt
│   │   │   │   ├── socket_create_pair.phpt
│   │   │   │   ├── socket_getopt.phpt
│   │   │   │   ├── socket_getpeername.phpt
│   │   │   │   ├── socket_getpeername_ipv4loop.phpt
│   │   │   │   ├── socket_getpeername_ipv6loop.phpt
│   │   │   │   ├── socket_getsockname.phpt
│   │   │   │   ├── socket_listen-wrongparams.phpt
│   │   │   │   ├── socket_read_params.phpt
│   │   │   │   ├── socket_select-wrongparams-2.phpt
│   │   │   │   ├── socket_select.phpt
│   │   │   │   ├── socket_select_error.phpt
│   │   │   │   ├── socket_sentto_recvfrom_ipv4_udp.phpt
│   │   │   │   ├── socket_sentto_recvfrom_ipv6_udp.phpt
│   │   │   │   ├── socket_sentto_recvfrom_unix.phpt
│   │   │   │   ├── socket_set_block-retval.phpt
│   │   │   │   ├── socket_set_nonblock-retval.phpt
│   │   │   │   ├── socket_set_nonblock.phpt
│   │   │   │   ├── socket_set_option_bindtodevice.phpt
│   │   │   │   ├── socket_set_option_error_socket_option.phpt
│   │   │   │   ├── socket_set_option_in6_pktinfo.phpt
│   │   │   │   ├── socket_set_option_rcvtimeo.phpt
│   │   │   │   ├── socket_set_option_seolinger.phpt
│   │   │   │   ├── socket_set_option_sndtimeo.phpt
│   │   │   │   ├── socket_setopt_basic.phpt
│   │   │   │   ├── socket_shutdown.phpt
│   │   │   │   ├── socket_strerror.phpt
│   │   │   │   └── unixloop.phpt
│   │   │   ├── error.phpt
│   │   │   ├── get_name.phpt
│   │   │   ├── import.phpt
│   │   │   ├── nonblock.phpt
│   │   │   ├── socketpair.phpt
│   │   │   ├── tcp_client.phpt
│   │   │   ├── tcp_server.phpt
│   │   │   ├── timeout.phpt
│   │   │   └── udp.phpt
│   │   ├── ssl/
│   │   │   ├── capture_peer_cert.phpt
│   │   │   ├── client.phpt
│   │   │   ├── enable_crypto.phpt
│   │   │   ├── local_cert.phpt
│   │   │   ├── server.phpt
│   │   │   └── without_key.phpt
│   │   ├── stdin.phpt
│   │   ├── stream_context.phpt
│   │   ├── stream_context_pass_null.phpt
│   │   ├── stream_copy_to_stream_socket.phpt
│   │   ├── stream_get_meta_data.phpt
│   │   ├── stream_select/
│   │   │   ├── base.phpt
│   │   │   ├── blocked.phpt
│   │   │   ├── bug46024.phpt
│   │   │   ├── bug60120.phpt
│   │   │   ├── bug60602.phpt
│   │   │   ├── bug64438.phpt
│   │   │   ├── bug64770.phpt
│   │   │   ├── bug69521.phpt
│   │   │   ├── bug72075.phpt
│   │   │   ├── conflict.phpt
│   │   │   ├── never_timeout.phpt
│   │   │   ├── preserve_keys.phpt
│   │   │   ├── return_val.phpt
│   │   │   ├── rw_events.phpt
│   │   │   ├── stream_set_blocking.phpt
│   │   │   └── timeout.phpt
│   │   ├── stream_socket_pair.phpt
│   │   ├── tcp-c10k.phpt
│   │   ├── tcp.phpt
│   │   ├── udg.phpt
│   │   ├── udp-c10k.phpt
│   │   ├── udp.phpt
│   │   ├── unix.phpt
│   │   └── unsafe/
│   │       └── pcntl_fork.phpt
│   ├── swoole_server/
│   │   ├── accept_zero.phpt
│   │   ├── addListener.phpt
│   │   ├── addProcess.phpt
│   │   ├── addProcess_base.phpt
│   │   ├── addProcess_with_error.phpt
│   │   ├── addProcess_with_event_wait.phpt
│   │   ├── addProcess_with_tick.phpt
│   │   ├── base/
│   │   │   ├── reload_1.phpt
│   │   │   ├── reload_2.phpt
│   │   │   ├── shutdown.phpt
│   │   │   └── shutdown_single.phpt
│   │   ├── bigPipeMessage.phpt
│   │   ├── big_session_id.phpt
│   │   ├── big_udp_packet.phpt
│   │   ├── bind.phpt
│   │   ├── bug_11000_01.phpt
│   │   ├── bug_1864.phpt
│   │   ├── bug_2308.phpt
│   │   ├── bug_2313.phpt
│   │   ├── bug_2639.phpt
│   │   ├── bug_2736.phpt
│   │   ├── bug_aio.phpt
│   │   ├── check_callback.phpt
│   │   ├── check_chunk_total_size.phpt
│   │   ├── client_close_in_writable_event.phpt
│   │   ├── close_force.phpt
│   │   ├── close_in_connect_callback.phpt
│   │   ├── close_in_manager.phpt
│   │   ├── close_in_master.phpt
│   │   ├── close_in_non_current_worker.phpt
│   │   ├── close_in_other_worker_with_base.phpt
│   │   ├── close_in_task_worker.phpt
│   │   ├── close_max_fd.phpt
│   │   ├── close_queued.phpt
│   │   ├── close_reset.phpt
│   │   ├── command.phpt
│   │   ├── connections.phpt
│   │   ├── discard_timeout_packet.phpt
│   │   ├── dispatch_fallback.phpt
│   │   ├── dispatch_func.phpt
│   │   ├── dispatch_func_discard.phpt
│   │   ├── dispatch_func_memory_leak.phpt
│   │   ├── dispatch_mode_1.phpt
│   │   ├── dispatch_mode_10.phpt
│   │   ├── dispatch_mode_3.phpt
│   │   ├── dispatch_mode_7.phpt
│   │   ├── dispatch_mode_8.phpt
│   │   ├── dispatch_mode_9.phpt
│   │   ├── duplicate_registered.phpt
│   │   ├── enable_coroutine.phpt
│   │   ├── enable_delay_receive.phpt
│   │   ├── enable_reuse_port.phpt
│   │   ├── eof_protocol.phpt
│   │   ├── eof_server.phpt
│   │   ├── event/
│   │   │   ├── before_shutdown.phpt
│   │   │   ├── manager_start.phpt
│   │   │   ├── manager_stop.phpt
│   │   │   ├── shutdown.phpt
│   │   │   ├── start.phpt
│   │   │   └── worker_exit.phpt
│   │   ├── exist.phpt
│   │   ├── force_reload.phpt
│   │   ├── force_reload2.phpt
│   │   ├── force_reload3.phpt
│   │   ├── force_reload4.phpt
│   │   ├── getCallback.phpt
│   │   ├── getClientInfo.phpt
│   │   ├── getClientInfo_in_callback_of_close.phpt
│   │   ├── getClientInfo_in_callback_of_close_2.phpt
│   │   ├── getClientList.phpt
│   │   ├── getLastError.phpt
│   │   ├── getSocket.phpt
│   │   ├── getWorkerStatus.phpt
│   │   ├── heartbeat.phpt
│   │   ├── heartbeat_true.phpt
│   │   ├── heartbeat_with_base.phpt
│   │   ├── http_protocol.phpt
│   │   ├── idle_worekr_num.phpt
│   │   ├── invalid_fd.phpt
│   │   ├── invalid_option.phpt
│   │   ├── kill_user_process_01.phpt
│   │   ├── kill_user_process_02.phpt
│   │   ├── kill_worker_01.phpt
│   │   ├── kill_worker_02.phpt
│   │   ├── last_time.phpt
│   │   ├── length/
│   │   │   ├── 00.phpt
│   │   │   ├── 01.phpt
│   │   │   ├── 02.phpt
│   │   │   ├── 03.phpt
│   │   │   └── length_func.phpt
│   │   ├── listen_fail.phpt
│   │   ├── max_idle_time_1.phpt
│   │   ├── max_idle_time_2.phpt
│   │   ├── max_queued_bytes.phpt
│   │   ├── max_request.phpt
│   │   ├── max_request_grace_disabled.phpt
│   │   ├── max_request_grace_enabled.phpt
│   │   ├── max_request_threshold.phpt
│   │   ├── memory_leak/
│   │   │   ├── length.phpt
│   │   │   ├── pipe_message.phpt
│   │   │   ├── task.phpt
│   │   │   └── tcp.phpt
│   │   ├── mqtt/
│   │   │   ├── length_offset.phpt
│   │   │   ├── recv_fail.phpt
│   │   │   └── send_big_pack.phpt
│   │   ├── new_twice.phpt
│   │   ├── object/
│   │   │   ├── event.phpt
│   │   │   ├── getManagerPid.phpt
│   │   │   ├── getMasterPid.phpt
│   │   │   ├── getWorkerId.phpt
│   │   │   ├── getWorkerPid.phpt
│   │   │   ├── packet.phpt
│   │   │   ├── pipe_message.phpt
│   │   │   ├── status_info.phpt
│   │   │   └── task_result.phpt
│   │   ├── onReload.phpt
│   │   ├── parse_option_to_size.phpt
│   │   ├── pid_file.phpt
│   │   ├── protect.phpt
│   │   ├── protect_false.phpt
│   │   ├── reload.phpt
│   │   ├── reload_async.phpt
│   │   ├── reload_process.phpt
│   │   ├── sendMessage_1.phpt
│   │   ├── sendMessage_2.phpt
│   │   ├── sendMessage_3.phpt
│   │   ├── sendMessage_4.phpt
│   │   ├── sendMessage_in_manager.phpt
│   │   ├── send_2.phpt
│   │   ├── send_2m_in_task_worker.phpt
│   │   ├── send_2m_in_user_process.phpt
│   │   ├── send_3.phpt
│   │   ├── send_big_packet.phpt
│   │   ├── send_in_master.phpt
│   │   ├── send_in_other_worker_with_base.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendfile_02.phpt
│   │   ├── sendfile_ssl.phpt
│   │   ├── sendto_timeout.phpt
│   │   ├── shutdown.phpt
│   │   ├── shutdown_in_master.phpt
│   │   ├── shutdown_in_process.phpt
│   │   ├── shutdown_with_base_mode.phpt
│   │   ├── sigint_with_base.phpt
│   │   ├── sigint_with_process.phpt
│   │   ├── single_thread/
│   │   │   ├── heartbeat.phpt
│   │   │   ├── large_packet.phpt
│   │   │   └── user_setting.phpt
│   │   ├── sleep.phpt
│   │   ├── slow_client.phpt
│   │   ├── slow_master.phpt
│   │   ├── slow_worker.phpt
│   │   ├── ssl/
│   │   │   ├── 00.phpt
│   │   │   ├── bad_client.phpt
│   │   │   ├── code/
│   │   │   │   ├── client.go
│   │   │   │   └── client.js
│   │   │   ├── dtls.phpt
│   │   │   ├── dtls_big_packet.phpt
│   │   │   ├── dtls_with_length_protocol.phpt
│   │   │   ├── golang.phpt
│   │   │   ├── heartbeat_1.phpt
│   │   │   ├── heartbeat_2.phpt
│   │   │   ├── nodejs.phpt
│   │   │   ├── ssl_send_wait.phpt
│   │   │   ├── verify_01.phpt
│   │   │   ├── verify_02.phpt
│   │   │   └── verify_03.phpt
│   │   ├── start_twice.phpt
│   │   ├── stats.phpt
│   │   ├── stats_file.phpt
│   │   ├── stats_file_json.phpt
│   │   ├── stats_file_php.phpt
│   │   ├── stop.phpt
│   │   ├── stop_in_workerStart.phpt
│   │   ├── systemd_fds.phpt
│   │   ├── task/
│   │   │   ├── base.phpt
│   │   │   ├── bug_2585.phpt
│   │   │   ├── callback_is_null.phpt
│   │   │   ├── enable_coroutine.phpt
│   │   │   ├── finish_timeout.phpt
│   │   │   ├── huge_data.phpt
│   │   │   ├── idle_worekr_num.phpt
│   │   │   ├── invalid_packet.phpt
│   │   │   ├── kill_01.phpt
│   │   │   ├── kill_02.phpt
│   │   │   ├── kill_task_worker_02.phpt
│   │   │   ├── scheduler_warning.phpt
│   │   │   ├── task_callback.phpt
│   │   │   ├── task_co.phpt
│   │   │   ├── task_enable_coroutine.phpt
│   │   │   ├── task_enable_coroutine_return.phpt
│   │   │   ├── task_in_manager.phpt
│   │   │   ├── task_in_master.phpt
│   │   │   ├── task_in_task_worker.phpt
│   │   │   ├── task_in_user_process.phpt
│   │   │   ├── task_ipc_mode_2.phpt
│   │   │   ├── task_ipc_mode_3.phpt
│   │   │   ├── task_max_request.phpt
│   │   │   ├── task_pack.phpt
│   │   │   ├── task_queue.phpt
│   │   │   ├── task_wait.phpt
│   │   │   ├── timer.phpt
│   │   │   ├── unpack.phpt
│   │   │   └── without_onfinish.phpt
│   │   ├── taskWaitMulti.phpt
│   │   ├── taskwait_01.phpt
│   │   ├── taskwait_02.phpt
│   │   ├── unregistered_signal.phpt
│   │   ├── unsock_dgram.phpt
│   │   ├── unsock_stream.phpt
│   │   ├── user_process.phpt
│   │   ├── user_process_2.phpt
│   │   ├── user_process_force_exit.phpt
│   │   ├── user_process_pid.phpt
│   │   ├── wrong_eof_setting.phpt
│   │   └── z_conn_10k.phpt
│   ├── swoole_server_coro/
│   │   ├── length_1.phpt
│   │   ├── random_port.phpt
│   │   ├── reuse_port.phpt
│   │   ├── ssl.phpt
│   │   └── tcp.phpt
│   ├── swoole_server_port/
│   │   ├── connections.phpt
│   │   ├── duplicate_registered.phpt
│   │   ├── heartbeat_1.phpt
│   │   ├── heartbeat_2.phpt
│   │   ├── heartbeat_3.phpt
│   │   ├── http.phpt
│   │   ├── multi_port.phpt
│   │   ├── sub_handshake.phpt
│   │   └── tcp_eof.phpt
│   ├── swoole_socket_coro/
│   │   ├── accept.phpt
│   │   ├── all.phpt
│   │   ├── bound_error.phpt
│   │   ├── cancel.phpt
│   │   ├── check_writev_readv_param_type.phpt
│   │   ├── closed.phpt
│   │   ├── complete_test.phpt
│   │   ├── concurrency.phpt
│   │   ├── construct_parse_args_failed.phpt
│   │   ├── fd.phpt
│   │   ├── getBoundCid.phpt
│   │   ├── getopt/
│   │   │   ├── get.phpt
│   │   │   └── tcpinfo.phpt
│   │   ├── getpeername.phpt
│   │   ├── getsockname.phpt
│   │   ├── icmp.phpt
│   │   ├── import_1.phpt
│   │   ├── import_2.phpt
│   │   ├── import_3.phpt
│   │   ├── import_4.phpt
│   │   ├── import_5.phpt
│   │   ├── iov_max.phpt
│   │   ├── peek_and_checkLiveness.phpt
│   │   ├── protocol/
│   │   │   ├── bug_3586.phpt
│   │   │   └── package_length_func.phpt
│   │   ├── readVectorAll.phpt
│   │   ├── readVectorAll_ssl.phpt
│   │   ├── readVector_ssl.phpt
│   │   ├── readVector_ssl_eagain.phpt
│   │   ├── readv.phpt
│   │   ├── readv_eagain.phpt
│   │   ├── recvAll.phpt
│   │   ├── recvAll_timeout.phpt
│   │   ├── recv_bad_packet.phpt
│   │   ├── recv_line.phpt
│   │   ├── recv_timeout.phpt
│   │   ├── recv_with_buffer.phpt
│   │   ├── reuse.phpt
│   │   ├── reuse_2.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendto.phpt
│   │   ├── sendto_big.phpt
│   │   ├── sendto_large_packet.phpt
│   │   ├── server_accept.phpt
│   │   ├── setopt/
│   │   │   ├── bindtodevice.phpt
│   │   │   ├── ipv6_pktinfo.phpt
│   │   │   ├── multicast.phpt
│   │   │   ├── recvtimeo.phpt
│   │   │   └── reuse.phpt
│   │   ├── shutdown.phpt
│   │   ├── ssl.phpt
│   │   ├── ssl_bad_server.phpt
│   │   ├── tcp-c10k.phpt
│   │   ├── ulimit.phpt
│   │   ├── unix_dgram.phpt
│   │   ├── unix_stream.phpt
│   │   ├── writeVectorAll.phpt
│   │   ├── writeVectorAll_ssl.phpt
│   │   ├── writeVector_ssl.phpt
│   │   ├── writeVector_ssl_eagain.phpt
│   │   ├── writev.phpt
│   │   └── writev_eagain.phpt
│   ├── swoole_ssh2/
│   │   ├── bug63480.phpt
│   │   ├── bug79631.phpt
│   │   ├── ssh2_auth.phpt
│   │   ├── ssh2_auth_pubkey.phpt
│   │   ├── ssh2_auth_pubkey_file.phpt
│   │   ├── ssh2_connect.phpt
│   │   ├── ssh2_exec.phpt
│   │   ├── ssh2_scp_recv.phpt
│   │   ├── ssh2_scp_send.phpt
│   │   ├── ssh2_send_eof.phpt
│   │   ├── ssh2_sftp_001.phpt
│   │   ├── ssh2_sftp_002.phpt
│   │   ├── ssh2_shell.phpt
│   │   ├── ssh2_skip.inc
│   │   ├── ssh2_stream_select.phpt
│   │   ├── ssh2_test.inc
│   │   ├── testkey_ed25519
│   │   └── testkey_ed25519.pub
│   ├── swoole_stdext/
│   │   ├── array_method/
│   │   │   ├── 0.phpt
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   └── method.phpt
│   │   ├── stream_method/
│   │   │   └── 0.phpt
│   │   ├── string_method/
│   │   │   ├── 0.phpt
│   │   │   ├── 1.phpt
│   │   │   ├── json.phpt
│   │   │   ├── marshal.phpt
│   │   │   ├── match.phpt
│   │   │   ├── mbstring.phpt
│   │   │   └── method.phpt
│   │   └── typed_array/
│   │       ├── 0.phpt
│   │       ├── 1.phpt
│   │       ├── 10.phpt
│   │       ├── 11.phpt
│   │       ├── 2.phpt
│   │       ├── 3.phpt
│   │       ├── 4.phpt
│   │       ├── 5.phpt
│   │       ├── 6.phpt
│   │       ├── 7.phpt
│   │       ├── 8.phpt
│   │       ├── 9.phpt
│   │       ├── array_pop.phpt
│   │       ├── array_push.phpt
│   │       ├── array_shift.phpt
│   │       ├── array_splice.phpt
│   │       ├── array_unshift.phpt
│   │       ├── resource.phpt
│   │       └── sort.phpt
│   ├── swoole_table/
│   │   ├── big_size.phpt
│   │   ├── bug_2263.phpt
│   │   ├── bug_2290.phpt
│   │   ├── create_10k_object.phpt
│   │   ├── del.phpt
│   │   ├── force_unlock.phpt
│   │   ├── foreach.phpt
│   │   ├── getMemorySize_1.phpt
│   │   ├── get_after_destroy.phpt
│   │   ├── get_before_create.phpt
│   │   ├── gh-5789.phpt
│   │   ├── incr_after_del.phpt
│   │   ├── int.phpt
│   │   ├── key_value.phpt
│   │   ├── negative.phpt
│   │   ├── random_bytes.phpt
│   │   ├── set_after_del.phpt
│   │   ├── stats.phpt
│   │   └── type_conv.phpt
│   ├── swoole_thread/
│   │   ├── add_update.phpt
│   │   ├── affinity.phpt
│   │   ├── arraylist.phpt
│   │   ├── async-io.phpt
│   │   ├── atomic_ctor.phpt
│   │   ├── barrier.phpt
│   │   ├── co-stream.phpt
│   │   ├── co-user-yield.phpt
│   │   ├── empty_args.phpt
│   │   ├── exit.phpt
│   │   ├── fatal_error_1.inc
│   │   ├── fatal_error_1.phpt
│   │   ├── fatal_error_2.inc
│   │   ├── fatal_error_2.phpt
│   │   ├── fatal_error_3.phpt
│   │   ├── incr.phpt
│   │   ├── info.phpt
│   │   ├── lock.phpt
│   │   ├── map.phpt
│   │   ├── map2array.phpt
│   │   ├── name.phpt
│   │   ├── numeric_strkey.phpt
│   │   ├── php_socket.phpt
│   │   ├── pipe.phpt
│   │   ├── priority.phpt
│   │   ├── putenv.phpt
│   │   ├── queue.phpt
│   │   ├── queue_notify_all.phpt
│   │   ├── server/
│   │   │   ├── base.phpt
│   │   │   ├── bug_5662.phpt
│   │   │   ├── bug_5694.phpt
│   │   │   ├── create_response.phpt
│   │   │   ├── exit.phpt
│   │   │   ├── fatal_error.phpt
│   │   │   ├── functions.inc
│   │   │   ├── heartbeat.phpt
│   │   │   ├── hook_flags.phpt
│   │   │   ├── listen.phpt
│   │   │   ├── manager_timer.phpt
│   │   │   ├── reload.phpt
│   │   │   ├── reload_task_workers.phpt
│   │   │   ├── reload_task_workers_async.phpt
│   │   │   ├── reset_concurrency.phpt
│   │   │   ├── send_in_user_process.phpt
│   │   │   ├── send_large_packet.phpt
│   │   │   ├── setting.phpt
│   │   │   ├── stop_worker.phpt
│   │   │   ├── taskCo.phpt
│   │   │   ├── taskWaitMulti.phpt
│   │   │   ├── udp_port.phpt
│   │   │   └── websocket.phpt
│   │   ├── shell_exec.phpt
│   │   ├── signal.phpt
│   │   ├── sort.phpt
│   │   ├── stdio.phpt
│   │   ├── stream.phpt
│   │   ├── stream_arg.phpt
│   │   ├── thread_status.phpt
│   │   └── yield.phpt
│   ├── swoole_timer/
│   │   ├── after.phpt
│   │   ├── after_fork.phpt
│   │   ├── bug_2342.phpt
│   │   ├── bug_4794.phpt
│   │   ├── bug_4794_2.phpt
│   │   ├── bug_4794_3.phpt
│   │   ├── bug_4794_4.phpt
│   │   ├── bug_4794_5.phpt
│   │   ├── bug_4794_6.phpt
│   │   ├── bug_4794_7.phpt
│   │   ├── bug_4794_8.phpt
│   │   ├── call_private.phpt
│   │   ├── callback_bug_with_array.phpt
│   │   ├── clearAll.phpt
│   │   ├── enable_coroutine.phpt
│   │   ├── enable_coroutine2.phpt
│   │   ├── function_alias.phpt
│   │   ├── greater_than_0.phpt
│   │   ├── info.phpt
│   │   ├── list.phpt
│   │   ├── manager.phpt
│   │   ├── master.phpt
│   │   ├── master_base.phpt
│   │   ├── memory.phpt
│   │   ├── next_round.phpt
│   │   ├── not_exist.phpt
│   │   ├── reinit_1.phpt
│   │   ├── reinit_2.phpt
│   │   ├── stats.phpt
│   │   ├── swoole_timer_list_alias.phpt
│   │   ├── task_worker.phpt
│   │   ├── task_worker_tick_1k.phpt
│   │   └── verify.phpt
│   ├── swoole_websocket_server/
│   │   ├── bug_1.phpt
│   │   ├── close_frame_flag.phpt
│   │   ├── close_frame_full.phpt
│   │   ├── compression.phpt
│   │   ├── disconnect.phpt
│   │   ├── disconnect_with_code.phpt
│   │   ├── dynamic_property.phpt
│   │   ├── empty_message.phpt
│   │   ├── exists_and_isEstablished.phpt
│   │   ├── fin.phpt
│   │   ├── fin2.phpt
│   │   ├── get_large_requests.phpt
│   │   ├── get_small_requests.phpt
│   │   ├── greeter.phpt
│   │   ├── header_token.phpt
│   │   ├── listener.phpt
│   │   ├── malformed_data.phpt
│   │   ├── memory.phpt
│   │   ├── message_size.phpt
│   │   ├── onDisconnct.phpt
│   │   ├── pack.phpt
│   │   ├── ping.phpt
│   │   ├── pingloop.phpt
│   │   ├── pingloop_open_ping_pong_frame.phpt
│   │   ├── pingpong.phpt
│   │   ├── pingpong_open_ping_pong_frame.phpt
│   │   ├── query.phpt
│   │   ├── recv_decode.phpt
│   │   ├── send_close_frame.phpt
│   │   ├── send_encode.phpt
│   │   ├── send_encode_async.phpt
│   │   ├── set_cookie_on_before_handshake_response.phpt
│   │   ├── set_cookie_on_handshake.phpt
│   │   └── websocket_compress_on_handshake.phpt
│   ├── template
│   └── test.sql
├── thirdparty/
│   ├── boost/
│   │   └── asm/
│   │       ├── LICENSE
│   │       ├── combined.S
│   │       ├── jump_arm64_aapcs_elf_gas.S
│   │       ├── jump_arm64_aapcs_macho_gas.S
│   │       ├── jump_combined_sysv_macho_gas.S
│   │       ├── jump_loongarch64_sysv_elf_gas.S
│   │       ├── jump_mips64_n64_elf_gas.S
│   │       ├── jump_ppc64_sysv_elf_gas.S
│   │       ├── jump_ppc64_sysv_macho_gas.S
│   │       ├── jump_ppc64_sysv_xcoff_gas.S
│   │       ├── jump_riscv64_sysv_elf_gas.S
│   │       ├── jump_sparc64_sysv_elf_gas.S
│   │       ├── jump_x86_64_sysv_elf_gas.S
│   │       ├── jump_x86_64_sysv_macho_gas.S
│   │       ├── make_arm64_aapcs_elf_gas.S
│   │       ├── make_arm64_aapcs_macho_gas.S
│   │       ├── make_combined_sysv_macho_gas.S
│   │       ├── make_loongarch64_sysv_elf_gas.S
│   │       ├── make_mips64_n64_elf_gas.S
│   │       ├── make_ppc64_sysv_elf_gas.S
│   │       ├── make_ppc64_sysv_macho_gas.S
│   │       ├── make_ppc64_sysv_xcoff_gas.S
│   │       ├── make_riscv64_sysv_elf_gas.S
│   │       ├── make_sparc64_sysv_elf_gas.S
│   │       ├── make_x86_64_sysv_elf_gas.S
│   │       └── make_x86_64_sysv_macho_gas.S
│   ├── hiredis/
│   │   ├── CHANGELOG.md
│   │   ├── COPYING
│   │   ├── README.md
│   │   ├── alloc.c
│   │   ├── alloc.h
│   │   ├── fmacros.h
│   │   ├── hiredis.c
│   │   ├── hiredis.h
│   │   ├── net.c
│   │   ├── net.h
│   │   ├── read.c
│   │   ├── read.h
│   │   ├── sds.c
│   │   ├── sds.h
│   │   └── sdsalloc.h
│   ├── llhttp/
│   │   ├── LICENSE
│   │   ├── LICENSE-MIT
│   │   ├── api.c
│   │   ├── http.c
│   │   ├── llhttp.c
│   │   └── llhttp.h
│   ├── multipart_parser.c
│   ├── multipart_parser.h
│   ├── nghttp2/
│   │   ├── COPYING
│   │   ├── LICENSE
│   │   ├── nghttp2.h
│   │   ├── nghttp2_buf.c
│   │   ├── nghttp2_buf.h
│   │   ├── nghttp2_hd.c
│   │   ├── nghttp2_hd.h
│   │   ├── nghttp2_hd_huffman.c
│   │   ├── nghttp2_hd_huffman.h
│   │   ├── nghttp2_hd_huffman_data.c
│   │   ├── nghttp2_helper.c
│   │   ├── nghttp2_mem.c
│   │   ├── nghttp2_mem.h
│   │   ├── nghttp2_rcbuf.c
│   │   ├── nghttp2_rcbuf.h
│   │   └── nghttp2ver.h
│   ├── nlohmann/
│   │   ├── LICENSE.MIT
│   │   ├── adl_serializer.hpp
│   │   ├── detail/
│   │   │   ├── conversions/
│   │   │   │   ├── from_json.hpp
│   │   │   │   ├── to_chars.hpp
│   │   │   │   └── to_json.hpp
│   │   │   ├── exceptions.hpp
│   │   │   ├── input/
│   │   │   │   ├── binary_reader.hpp
│   │   │   │   ├── input_adapters.hpp
│   │   │   │   ├── json_sax.hpp
│   │   │   │   ├── lexer.hpp
│   │   │   │   ├── parser.hpp
│   │   │   │   └── position_t.hpp
│   │   │   ├── iterators/
│   │   │   │   ├── internal_iterator.hpp
│   │   │   │   ├── iter_impl.hpp
│   │   │   │   ├── iteration_proxy.hpp
│   │   │   │   ├── iterator_traits.hpp
│   │   │   │   ├── json_reverse_iterator.hpp
│   │   │   │   └── primitive_iterator.hpp
│   │   │   ├── json_pointer.hpp
│   │   │   ├── json_ref.hpp
│   │   │   ├── macro_scope.hpp
│   │   │   ├── macro_unscope.hpp
│   │   │   ├── meta/
│   │   │   │   ├── cpp_future.hpp
│   │   │   │   ├── detected.hpp
│   │   │   │   ├── is_sax.hpp
│   │   │   │   ├── type_traits.hpp
│   │   │   │   └── void_t.hpp
│   │   │   ├── output/
│   │   │   │   ├── binary_writer.hpp
│   │   │   │   ├── output_adapters.hpp
│   │   │   │   └── serializer.hpp
│   │   │   └── value_t.hpp
│   │   ├── json.hpp
│   │   ├── json_fwd.hpp
│   │   └── thirdparty/
│   │       └── hedley/
│   │           ├── hedley.hpp
│   │           └── hedley_undef.hpp
│   ├── pdo_oci/
│   │   ├── CREDITS
│   │   ├── README.md
│   │   ├── oci_driver.c
│   │   ├── oci_statement.c
│   │   ├── pdo_oci.c
│   │   └── php_pdo_oci_int.h
│   ├── pdo_sqlite/
│   │   ├── php_pdo_sqlite.h
│   │   ├── php_pdo_sqlite_int.h
│   │   ├── sqlite_driver.c
│   │   ├── sqlite_sql_parser.c
│   │   └── sqlite_statement.c
│   ├── php/
│   │   ├── LICENSE
│   │   ├── curl/
│   │   │   ├── curl_arginfo.h
│   │   │   ├── curl_private.h
│   │   │   ├── interface.cc
│   │   │   ├── multi.cc
│   │   │   └── php_curl.h
│   │   ├── main/
│   │   │   └── SAPI.h
│   │   ├── sockets/
│   │   │   ├── conversions.cc
│   │   │   ├── conversions.h
│   │   │   ├── multicast.cc
│   │   │   ├── multicast.h
│   │   │   ├── php_sockets_cxx.h
│   │   │   ├── sendrecvmsg.cc
│   │   │   └── sockaddr_conv.cc
│   │   ├── ssh2/
│   │   │   ├── LICENSE
│   │   │   ├── php_ssh2.h
│   │   │   ├── ssh2.cc
│   │   │   ├── ssh2_fopen_wrappers.cc
│   │   │   └── ssh2_sftp.cc
│   │   ├── standard/
│   │   │   ├── proc_open.cc
│   │   │   ├── proc_open.h
│   │   │   └── var_decoder.cc
│   │   ├── streams/
│   │   │   ├── php_streams_int.h
│   │   │   └── plain_wrapper.c
│   │   └── zend/
│   │       └── zend_execute.c
│   ├── php82/
│   │   ├── pdo_odbc/
│   │   │   ├── odbc_driver.c
│   │   │   ├── odbc_stmt.c
│   │   │   └── php_pdo_odbc_int.h
│   │   └── pdo_pgsql/
│   │       ├── pgsql_driver.c
│   │       ├── pgsql_driver_arginfo.h
│   │       ├── pgsql_statement.c
│   │       └── php_pdo_pgsql_int.h
│   ├── php83/
│   │   ├── pdo_odbc/
│   │   │   ├── odbc_driver.c
│   │   │   ├── odbc_stmt.c
│   │   │   └── php_pdo_odbc_int.h
│   │   └── pdo_pgsql/
│   │       ├── pgsql_driver.c
│   │       ├── pgsql_driver_arginfo.h
│   │       ├── pgsql_statement.c
│   │       └── php_pdo_pgsql_int.h
│   ├── php84/
│   │   ├── curl/
│   │   │   ├── curl_arginfo.h
│   │   │   ├── curl_private.h
│   │   │   ├── interface.cc
│   │   │   ├── multi.cc
│   │   │   └── php_curl.h
│   │   ├── ftp/
│   │   │   ├── CREDITS
│   │   │   ├── ftp.c
│   │   │   ├── ftp.h
│   │   │   ├── php_ftp.c
│   │   │   └── php_ftp.h
│   │   ├── pdo_firebird/
│   │   │   ├── CREDITS
│   │   │   ├── firebird_driver.c
│   │   │   ├── firebird_statement.c
│   │   │   ├── pdo_firebird_utils.cpp
│   │   │   ├── pdo_firebird_utils.h
│   │   │   └── php_pdo_firebird_int.h
│   │   ├── pdo_odbc/
│   │   │   ├── odbc_driver.c
│   │   │   ├── odbc_stmt.c
│   │   │   └── php_pdo_odbc_int.h
│   │   └── pdo_pgsql/
│   │       ├── pgsql_driver.c
│   │       ├── pgsql_driver_arginfo.h
│   │       ├── pgsql_sql_parser.c
│   │       ├── pgsql_statement.c
│   │       └── php_pdo_pgsql_int.h
│   └── php85/
│       ├── pdo_firebird/
│       │   ├── CREDITS
│       │   ├── firebird_driver.c
│       │   ├── firebird_statement.c
│       │   ├── pdo_firebird_utils.cpp
│       │   ├── pdo_firebird_utils.h
│       │   └── php_pdo_firebird_int.h
│       ├── pdo_odbc/
│       │   ├── odbc_driver.c
│       │   ├── odbc_stmt.c
│       │   ├── php_pdo_odbc.h
│       │   └── php_pdo_odbc_int.h
│       └── pdo_pgsql/
│           ├── pdo_pgsql_arginfo.h
│           ├── pgsql_driver.c
│           ├── pgsql_driver_arginfo.h
│           ├── pgsql_sql_parser.c
│           ├── pgsql_statement.c
│           ├── php_pdo_pgsql.h
│           └── php_pdo_pgsql_int.h
└── tools/
    ├── analysis.php
    ├── arginfo-check.php
    ├── bootstrap.php
    ├── build-library.php
    ├── code-generator.php
    ├── composer.json
    ├── constant-generator.php
    ├── export.php
    ├── gen-data.php
    ├── gen-ext-class.php
    ├── get-ip-info.php
    ├── next-version.php
    ├── option-generator.php
    ├── pecl-package.php
    ├── phpt-fixer.php
    ├── rename.php
    ├── send-http-data.php
    ├── show-big-files.php
    └── templates/
        ├── class.c
        └── version.tpl.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .clang-format
================================================
---
Language:        Cpp
# BasedOnStyle:  Google
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands:   true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: true
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
  AfterClass:      false
  AfterControlStatement: false
  AfterEnum:       false
  AfterFunction:   false
  AfterNamespace:  false
  AfterObjCDeclaration: false
  AfterStruct:     false
  AfterUnion:      false
  AfterExternBlock: false
  BeforeCatch:     false
  BeforeElse:      false
  IndentBraces:    false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
  SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit:      120
CommentPragmas:  '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat:   false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
IncludeBlocks:   Preserve
IncludeCategories:
  - Regex:           '^<ext/.*\.h>'
    Priority:        2
  - Regex:           '^<.*\.h>'
    Priority:        1
  - Regex:           '^<.*'
    Priority:        2
  - Regex:           '.*'
    Priority:        3
IncludeIsMainRegex: '([-_](test|unittest))?$'
IndentCaseLabels: false
IndentPPDirectives: None
IndentWidth:     4
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd:   ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: false
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Right
ReflowComments:  true
SortIncludes:    false
SortUsingDeclarations: true
SpaceAfterCStyleCast: true
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles:  false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard:        Auto
TabWidth:        8
UseTab:          Never

================================================
FILE: .editorconfig
================================================
# https://editorconfig.org/

root = true

[*]
trim_trailing_whitespace = true
insert_final_newline     = true
end_of_line              = lf
charset                  = utf-8
indent_style             = space
tab_width                = 4

[{*.{awk,sh},Makefile*}]
indent_size              = 4
indent_style             = table
max_line_length          = 80

[*.{c,cc,cpp,h,html,inc,php,phpt}]
indent_size              = 4
indent_style             = space
max_line_length          = 120

[*.md]
indent_style             = space
max_line_length          = 120

[COMMIT_EDITMSG]
indent_size              = 4
indent_style             = space
max_line_length          = 80



================================================
FILE: .gitattributes
================================================
/.github/ export-ignore
/benchmark/ export-ignore
/core-tests/ export-ignore
*.h linguist-language=cpp


================================================
FILE: .github/ISSUE_TEMPLATE
================================================
Please answer these questions before submitting your issue.

1. What did you do? If possible, provide a simple script for reproducing the error.



2. What did you expect to see?



3. What did you see instead?



4. What version of Swoole are you using (show your `php --ri swoole`)?



5. What is your machine environment used (show your `uname -a` & `php -v` & `gcc -v`) ?




================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/alpine.Dockerfile
================================================
ARG PHP_VERSION
ARG ALPINE_VERSION

FROM phpswoole/php:${PHP_VERSION}-alpine

LABEL maintainer="Swoole Team <team@swoole.com>" version="1.0" license="Apache2"

ARG PHP_VERSION

COPY . /swoole

WORKDIR /swoole

RUN apk add liburing-dev

RUN set -ex \
    && phpize \
    && ./configure --enable-swoole-curl --enable-iouring \
    && make -s -j$(nproc) && make install

RUN echo "extension=swoole.so" > "/usr/local/etc/php/conf.d/swoole.ini"
RUN php -v
RUN php -m
RUN php --ri swoole
RUN echo -e "\033[42;37m Build Completed :).\033[0m\n"


================================================
FILE: .github/workflows/core.yml
================================================
name: Core Tests

on: [ push, pull_request ]

env:
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

jobs:
  ubuntu:
    runs-on: ubuntu-latest
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[core]')"
    timeout-minutes: 12
    services:
      tinyproxy:
        image: "vimagick/tinyproxy"
        ports:
          - 8888:8888
      nginx:
        image: "nginx"
        ports:
          - "80:80"
        env:
          NGINX_PORT: "[::]:80"
      socks5:
        image: "xkuma/socks5"
        ports:
          - 8080:1080
        env:
          PROXY_USER: user
          PROXY_PASSWORD: password
          PROXY_SERVER: 0.0.0.0:1080
      socks5-no-auth:
        image: "xkuma/socks5"
        ports:
          - 8081:1080
        env:
          PROXY_SERVER: 0.0.0.0:1080

    steps:
      - uses: actions/checkout@v6

      - name: install dependencies
        run: sudo apt update -y && sudo apt install -y googletest libgtest-dev libnghttp2-dev libboost-stacktrace-dev libbrotli-dev redis-server nodejs npm nghttp2-client

      - name: install liburing
        run: sudo bash ./scripts/install-liburing.sh

      - name: configure
        run: phpize && ./configure --enable-sockets --enable-mysqlnd --enable-iouring

      - name: build
        run: |
          cmake . -D CODE_COVERAGE=ON -D enable_thread=1 -D verbose=1 -D async_io=1 || exit 1
          make VERBOSE=1 -j $(nproc) core-tests || exit 1

      - name: run tests
        run: |
          ./run-core-tests.sh

      - name: run coverage
        shell: bash
        run: sudo apt-get install lcov &&
          sudo lcov --directory . --capture --branch-coverage --rc geninfo_unexecuted_blocks=1 --ignore-errors mismatch --output-file coverage.info &&
          sudo lcov --remove coverage.info '/usr/*' --output-file coverage.info &&
          sudo lcov --list coverage.info

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ./coverage.info
          fail_ci_if_error: true


================================================
FILE: .github/workflows/coverity.yml
================================================
name: coverity-scan

on:
  push:
    branches:
      - coverity_scan

env:
  COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
  COVERITY_SCAN_EMAIL: team@swoole.com
  COVERITY_PROJECT: ${{ github.repository }}
  COV_TOOLS_DIR: ${{ github.workspace }}/cov-analysis-linux64
  COV_BUILD_DIR: ${{ github.workspace }}
  COV_RESULTS_DIR: cov-int
  COV_RESULTS_FILE: analysis-results.tgz

jobs:
  coverity-scan:
    if: "github.repository_owner == 'swoole' && (!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[coverity]'))"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: "8.3"

      - name: Download and install Coverity Build Tool
        run: |
          wget -q https://scan.coverity.com/download/linux64 \
                --post-data "token=${COVERITY_SCAN_TOKEN}&project=${COVERITY_PROJECT}" \
                -O cov-analysis-linux64.tar.gz
          mkdir ${COV_TOOLS_DIR}
          tar xzf cov-analysis-linux64.tar.gz --strip 1 -C ${COV_TOOLS_DIR}
          ls -la ${COV_TOOLS_DIR}/bin

      - name: Run build steps
        run: |
          sudo phpize && ./configure --enable-mysqlnd --enable-sockets --enable-swoole-curl

      - name: Run Coverity Scan Analysis Tool
        run: |
          export PATH=${COV_TOOLS_DIR}/bin:$PATH
          cd ${COV_BUILD_DIR}
          cov-build --dir ${COV_RESULTS_DIR} make -j $(nproc)

      - name: Upload Coverity Scan Analysis results
        run: |
          cd ${COV_BUILD_DIR}
          tar czf ${COV_RESULTS_FILE} ${COV_RESULTS_DIR}
          curl \
            --form project=${COVERITY_PROJECT} \
            --form token=${COVERITY_SCAN_TOKEN} \
            --form email=${COVERITY_SCAN_EMAIL} \
            --form file=@${COV_RESULTS_FILE} \
            --form version=${GITHUB_SHA} \
            --form description="GitHub Actions" \
              https://scan.coverity.com/builds?project=${COVERITY_PROJECT}


================================================
FILE: .github/workflows/ext.yml
================================================
name: Compile Tests

on: [ push, pull_request ]

env:
  CPPFLAGS: "-I/opt/homebrew/opt/pcre2/include/"

jobs:
  build-ubuntu-latest:
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[ubuntu]')"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: install-deps
        run: sudo apt update -y && sudo apt install -y libcurl4-openssl-dev php-curl libc-ares-dev
      - name: phpize
        run: phpize
      - name: build1
        run: ./configure &&
          make clean && make -j$(nproc)
      - name: build2
        run: ./configure --enable-sockets &&
          make clean && make -j$(nproc)
      - name: build5
        run: ./configure --enable-sockets --enable-mysqlnd &&
          make clean && make -j$(nproc)
      - name: build6
        run: ./configure --enable-sockets --enable-mysqlnd --enable-debug-log &&
          make clean && make -j$(nproc)
      - name: build7
        run: ./configure --enable-sockets --enable-mysqlnd --enable-swoole-curl --enable-debug-log &&
          make clean && make -j$(nproc)
      - name: build8
        run: ./configure --enable-sockets --enable-mysqlnd --enable-swoole-curl --enable-cares --enable-debug-log &&
          make clean && make -j$(nproc)
      - name: build with thread context
        run: ./configure --enable-sockets --enable-mysqlnd --enable-swoole-curl --enable-cares --enable-debug-log --enable-thread-context &&
          make clean && make -j$(nproc)

  build-macos-latest:
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[macos]')"
    runs-on: macos-latest
    steps:
      - name: install dependencies
        run: brew reinstall php
      - uses: actions/checkout@v6
      - name: phpize
        run: phpize
      - name: build1
        run: ./configure CPPFLAGS="${CPPFLAGS}" && make clean && make -j$(sysctl -n hw.ncpu)
      - name: build2
        run: ./configure CPPFLAGS="${CPPFLAGS}" --enable-sockets &&
          make clean && make -j$(sysctl -n hw.ncpu)
      - name: build5
        run: ./configure CPPFLAGS="${CPPFLAGS}" --enable-sockets --enable-mysqlnd &&
          make clean && make -j$(sysctl -n hw.ncpu)
      - name: build6
        run: ./configure CPPFLAGS="${CPPFLAGS}" --enable-sockets --enable-mysqlnd --enable-swoole-curl --enable-debug-log &&
          make clean && make -j$(sysctl -n hw.ncpu)
      - name: build7
        run: ./configure CPPFLAGS="${CPPFLAGS}" --enable-sockets --enable-mysqlnd --enable-swoole-curl
          --enable-debug-log --enable-cares &&
          make clean && make -j$(sysctl -n hw.ncpu)

  build-alpine-latest:
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[alpine]')"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        php-version: [ '8.2', '8.3', '8.4', '8.5' ]
      max-parallel: 8
      fail-fast: false
    steps:
      - uses: actions/checkout@v6
      - name: build
        run: |
          cp .github/workflows/alpine.Dockerfile alpine.Dockerfile
          docker build -t swoole . -f alpine.Dockerfile --build-arg PHP_VERSION=${{ matrix.php-version }}


================================================
FILE: .github/workflows/framework.yml
================================================
name: Framework Tests

on:
  push:
  pull_request:

jobs:
  linux:
    runs-on: ubuntu-latest
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[framework]')"
    strategy:
      fail-fast: false
      matrix:
        php-version: [ '8.2', '8.3', '8.4', '8.5' ]
        framework: [ 'Laravel Octane', 'Hyperf', 'Simps' ]
    name: ${{ matrix.framework }} - PHP ${{ matrix.php-version }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-version }}
          extensions: dom, curl, libxml, mbstring, zip, redis, pdo, pdo_mysql, bcmath
          tools: phpize, composer:v2
          ini-values: extension=swoole
          coverage: none

      - name: Build Swoole
        run: |
          sudo apt update -y && sudo apt install -y libcurl4-openssl-dev php-curl libc-ares-dev libpq-dev valgrind
          phpize
          ./configure --enable-mysqlnd --enable-swoole-curl --enable-cares --enable-swoole-pgsql
          make -j$(nproc)
          sudo make install
          php -v
          php -m
          php --ini
          php --ri swoole

      - name: Laravel Octane Tests
        if: matrix.framework == 'Laravel Octane' && matrix.php-version != '8.5'
        run: |
          git clone https://github.com/laravel/octane.git --depth=1
          cd octane/
          composer update --prefer-dist --no-interaction --no-progress
          vendor/bin/testbench package:sync-skeleton
          vendor/bin/phpunit --display-deprecations --fail-on-deprecation

      - name: Hyperf Tests
        if: matrix.framework == 'Hyperf' && matrix.php-version != '8.5'
        env:
          SW_VERSION: 'master'
          MYSQL_VERSION: '5.7'
          PGSQL_VERSION: '14'
        run: |
          git clone https://github.com/hyperf/hyperf.git --depth=1
          cd hyperf/
          composer update -o
          ./.travis/requirement.install.sh
          ./.travis/setup.services.sh
          export TRAVIS_BUILD_DIR=$(pwd) && bash ./.travis/setup.mysql.sh
          export TRAVIS_BUILD_DIR=$(pwd) && bash ./.travis/setup.pgsql.sh
          cp .travis/.env.example .env
          export SWOOLE_BRANCH=${GITHUB_REF##*/}
          if [ "${SWOOLE_BRANCH}" = "valgrind" ]; then
            USE_ZEND_ALLOC=0 valgrind php -dswoole.use_shortname='Off' bin/co-phpunit --exclude-group NonCoroutine
            USE_ZEND_ALLOC=0 valgrind php -dswoole.use_shortname='Off' vendor/bin/phpunit --group NonCoroutine
            USE_ZEND_ALLOC=0 valgrind php -dswoole.use_shortname='Off' vendor/bin/phpunit src/filesystem --group NonCoroutine
          else
            .travis/run.test.sh
          fi

      - name: Simps Tests
        if: matrix.framework == 'Simps'
        run: |
          git clone https://github.com/simps/mqtt.git --depth=1
          cd mqtt/
          composer install -o
          composer test

  macos:
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[framework]')"
    runs-on: macos-latest
    strategy:
      fail-fast: false
      matrix:
        php-version: [ '8.2', '8.3', '8.4', '8.5' ]
        framework: [ 'Simps' ]
    name: ${{ matrix.framework }} - PHP ${{ matrix.php-version }} - macOS
    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-version }}
          extensions: dom, curl, libxml, mbstring, zip, redis, pdo, pdo_mysql, bcmath
          tools: phpize, composer:v2
          ini-values: extension=swoole
          coverage: none

      - name: Build Swoole
        run: |
          phpize
          export CPPFLAGS="${CPPFLAGS} -I/opt/homebrew/opt/pcre2/include/"
          export CFLAGS="${CFLAGS} -I/opt/homebrew/opt/pcre2/include/"
          ./configure --enable-mysqlnd --enable-swoole-curl --enable-cares
          make -j$(sysctl -n hw.ncpu)
          sudo make install
          php --ri swoole

      - name: Simps Tests
        if: matrix.framework == 'Simps'
        run: |
          git clone https://github.com/simps/mqtt.git --depth=1
          cd mqtt/
          composer install -o
          composer test



================================================
FILE: .github/workflows/iouring.yml
================================================
name: Linux io_uring Tests

on: [push, pull_request]

jobs:
  linux:
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[iouring]')"
    strategy:
      fail-fast: false
      matrix:
        php: [ '8.2', '8.3', '8.4', '8.5' ]
        os: [ ubuntu-24.04, ubuntu-24.04-arm ]
    name: ${{ matrix.php }}-${{ matrix.os }}-iouring
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v6
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: "${{ matrix.php }}"
          coverage: none
      - name: Show machine information
        run: |
          date
          env
          uname -a
          ulimit -a
          php -v
          php --ini
          ls -al
          pwd
          echo "`git log -20 --pretty --oneline`"
          echo "`git log -10 --stat --pretty --oneline`"
      - name: Run Swoole test
        run: |
          export SWOOLE_CI_TYPE=IOURING
          export SWOOLE_BRANCH=${GITHUB_REF##*/}
          export SWOOLE_BUILD_DIR=$(realpath .)
          export PHP_VERSION=${{ matrix.php }}
          ${SWOOLE_BUILD_DIR}/scripts/route.sh



================================================
FILE: .github/workflows/thread.yml
================================================
name: Thread Support Tests

on: [push, pull_request]

jobs:
  linux:
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[thread]')"
    timeout-minutes: 15
    strategy:
      fail-fast: false
      matrix:
        php: ['8.2-zts', '8.3-zts', '8.4-zts', '8.5-zts']
        os: [ ubuntu-24.04, ubuntu-24.04-arm ]
    name: ${{ matrix.php }}-thread-${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v6
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: "${{ matrix.php }}"
        coverage: none
      env:
        phpts: ts
    - name: Show machine information
      run: |
        date
        env
        uname -a
        ulimit -a
        php -v
        php --ini
        ls -al
        pwd
        echo "`git log -20 --pretty --oneline`"
        echo "`git log -10 --stat --pretty --oneline`"
    - name: Run tests
      run: |
        export SWOOLE_CI_TYPE=THREAD
        export SWOOLE_BRANCH=${GITHUB_REF##*/}
        export SWOOLE_BUILD_DIR=$(realpath .)
        export PHP_VERSION=${{ matrix.php }}
        ${SWOOLE_BUILD_DIR}/scripts/route.sh


================================================
FILE: .github/workflows/unit.yml
================================================
name: Unit Tests

on: [push, pull_request]

jobs:
  linux:
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[unit]')"
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        php: ['8.2', '8.3', '8.4', '8.5']
        os: [ ubuntu-24.04, ubuntu-24.04-arm ]
    name: ${{ matrix.php }}-${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v6
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: "${{ matrix.php }}"
        coverage: none
    - name: Show machine information
      run: |
        date
        env
        uname -a
        ulimit -a
        php -v
        php --ini
        ls -al
        pwd
        echo "`git log -20 --pretty --oneline`"
        echo "`git log -10 --stat --pretty --oneline`"
    - name: Run unit tests
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
      run: |
        export SWOOLE_CI_TYPE=NORMAL
        export SWOOLE_BRANCH=${GITHUB_REF##*/}
        export SWOOLE_BUILD_DIR=$(realpath .)
        export PHP_VERSION=${{ matrix.php }}
        ${{runner.workspace}}/swoole-src/scripts/route.sh
  macos:
    runs-on: macos-latest
    if: "!contains(github.event.head_commit.message, '--filter=') || contains(github.event.head_commit.message, '[macos-unit]')"
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
#        php-version: [ '8.2', '8.3', '8.4', '8.5' ]
        php-version: [ '8.3' ]
    name: ${{ matrix.php-version }} - macOS
    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-version }}
          extensions: dom, curl, libxml, mbstring, zip, redis, pdo, pdo_mysql, bcmath, sockets
          tools: phpize, composer:v2
          ini-values: extension=swoole
          coverage: none

      - name: Install dependencies
        run: |
          brew install redis tinyproxy nginx md5sha1sum
          brew services start redis
          brew services start nginx
          brew services start tinyproxy

      - name: Build Swoole
        run: |
          phpize
          export PCRE2_INCLUDE_DIR="/opt/homebrew/opt/pcre2/include"
          export CPPFLAGS="${CPPFLAGS} -I${PCRE2_INCLUDE_DIR}"
          export CFLAGS="${CFLAGS} -I${PCRE2_INCLUDE_DIR}"
          ./configure CPPFLAGS="${CPPFLAGS}" --enable-sockets --enable-mysqlnd --enable-swoole-curl --enable-cares --enable-zstd
          make -j$(sysctl -n hw.ncpu)
          sudo make install
          php --ri swoole
          uname -a

      - name: Run unit tests
        run: |
          export SWOOLE_CI_TYPE=NORMAL
          export SWOOLE_BRANCH=${GITHUB_REF##*/}
          export SWOOLE_BUILD_DIR=$(realpath .)
          export PHP_VERSION=${{ matrix.php-version }}
          export SWOOLE_CI_IN_MACOS=1
          cd ${{runner.workspace}}/swoole-src
          ulimit -n 100000
          ./scripts/run-tests.sh


================================================
FILE: .gitignore
================================================
/.cproject
/.idea
/.project
*.o
*.lo
*~
*.so
*.loT
*.pid
*.dep
modules/*
/.deps
/.libs/
/core
/examples/core
/Debug
/Release
/CMakeFiles
/cmake_install.cmake
/CMakeCache.txt
/Makefile
/bin
/lib
/library
/install_manifest.txt
/config.guess
/config.h
/config.h.in
/config.log
/config.nice
/config.status
/config.sub
/configure
/Makefile.fragments
/Makefile.global
/Makefile.objects
/install-sh
/libtool
/ltmain.sh
/missing
/mkinstalldirs
/swoole.la
/acinclude.m4
/aclocal.m4
/run-tests.php
/autom4te.cache
/build
/examples/async/data.txt
/examples/.idea
/examples/recv_file.jpg
/modules
/examples/async/test.copy
/examples/ssl_client
/examples/ssl/ca.crt
/examples/ssl/client.key
/examples/ssl/client.pfx
/examples/ssl/client
/examples/ssl/corpssl.crt
/examples/ssl/corpssl.key
/examples/ext
/benchmark/.idea/
/benchmark/vendor
/benchmark/composer.lock
/tools/.idea/
/tmp-php.ini
.settings/
tests/.idea
/tests/swoole_*/*.log
/tests/swoole_*/*.sh
/tests/swoole_*/*.diff
/tests/swoole_*/*.out
/tests/swoole_*/*.exp
/tests/swoole_*/*.mem
/tests/swoole_*/*.php
/tests/swoole_library/curl/skip
/core-tests/server/*.log
cmake-build-debug/
*.cbp
/.vscode
/.vs
/configure.in
/configure.ac

# core-tests
/core-tests/CMakeCache.txt
/core-tests/CMakeFiles/
/core-tests/Makefile
/core-tests/bin/
/core-tests/cmake_install.cmake
/core-tests/samples/Makefile
/core-tests/samples/cmake_install\.cmake
/core-tests/samples/CMakeCache\.txt
/core-tests/samples/bin/
/core-tests/samples/CMakeFiles/
/core-tests/.project
/core-tests/.cproject
/core-tests/compile_commands.json
/core-tests/samples/.project
/core-tests/fuzz/fuzz_results/
/core-tests/fuzz/bin/

/tools/vendor
/tools/composer.lock
/examples/wrapper/CMakeFiles
/examples/wrapper/CMakeCache.txt
/examples/wrapper/Makefile
/examples/wrapper/server
/examples/wrapper/cmake_install.cmake
/out
/gcov_result

# coverage
*.gcno
*.gcov
*.gcda
*.info
/html
/tests/include/lib/vendor/
/tests/include/lib/composer.lock
/scripts/data
/.cmake/
/Testing/
build.ninja

================================================
FILE: .php-cs-fixer.dist.php
================================================
<?php

$header = <<<'EOF'
This file is part of Swoole.

@link     https://www.swoole.com
@contact  team@swoole.com
@license  https://github.com/swoole/library/blob/master/LICENSE
EOF;

return (new PhpCsFixer\Config())
    ->setRiskyAllowed(true)
    ->setRules([
        '@DoctrineAnnotation'                              => true,
        '@PhpCsFixer'                                      => true,
        '@PSR2'                                            => true,
        '@Symfony'                                         => true,
        'align_multiline_comment'                          => ['comment_type' => 'all_multiline'],
        'array_syntax'                                     => ['syntax' => 'short'],
        'binary_operator_spaces'                           => ['operators' => ['=' => 'align', '=>' => 'align', ]],
        'blank_line_after_namespace'                       => true,
        'blank_line_before_statement'                      => ['statements' => ['declare']],
        'class_attributes_separation'                      => true,
        'concat_space'                                     => ['spacing' => 'one'],
        'constant_case'                                    => ['case' => 'lower'],
        'combine_consecutive_unsets'                       => true,
        'declare_strict_types'                             => true,
        'fully_qualified_strict_types'                     => ['phpdoc_tags' => []],
        'general_phpdoc_annotation_remove'                 => ['annotations' => ['author']],
        'header_comment'                                   => ['comment_type' => 'PHPDoc', 'header' => $header, 'location' => 'after_open', 'separate' => 'bottom'],
        'increment_style'                                  => ['style' => 'post'],
        'lambda_not_used_import'                           => false,
        'linebreak_after_opening_tag'                      => true,
        'list_syntax'                                      => ['syntax' => 'short'],
        'lowercase_static_reference'                       => true,
        'multiline_comment_opening_closing'                => true,
        'multiline_whitespace_before_semicolons'           => ['strategy' => 'new_line_for_chained_calls'],
        'no_superfluous_phpdoc_tags'                       => ['allow_mixed' => true, 'allow_unused_params' => true, 'remove_inheritdoc' => false],
        'no_unused_imports'                                => true,
        'no_useless_else'                                  => true,
        'no_useless_return'                                => true,
        'not_operator_with_space'                          => false,
        'not_operator_with_successor_space'                => false,
        'php_unit_strict'                                  => false,
        'phpdoc_align'                                     => ['align' => 'left'],
        'phpdoc_annotation_without_dot'                    => false,
        'phpdoc_no_empty_return'                           => false,
        'phpdoc_types_order'                               => ['sort_algorithm' => 'none', 'null_adjustment' => 'always_last'],
        'phpdoc_separation'                                => false,
        'phpdoc_summary'                                   => false,
        'ordered_class_elements'                           => true,
        'ordered_imports'                                  => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'],
        'ordered_types'                                    => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'],
        'single_line_comment_style'                        => ['comment_types' => []],
        'single_line_comment_spacing'                      => false,
        'single_line_empty_body'                           => false,
        'single_quote'                                     => true,
        'standardize_increment'                            => false,
        'standardize_not_equals'                           => true,
        'yoda_style'                                       => ['always_move_variable' => false, 'equal' => false, 'identical' => false],
    ])
    ->setFinder(
        PhpCsFixer\Finder::create()
            ->exclude(['html', 'vendor'])
            ->in(__DIR__)
    )
    ->setUsingCache(false);


================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.10)
project(libswoole)

enable_language(ASM)
set(SWOOLE_VERSION 6.2.0)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g")

file(READ ./config.h SWOOLE_CONFIG_FILE)

set(CMAKE_MACOSX_RPATH 1)
set(SWOOLE_LINK_LIBRARIES pthread dl)

if (APPLE)
    set(CMAKE_SHARED_LINKER_FLAGS "-undefined dynamic_lookup")
    include_directories(BEFORE /usr/local/include)
    link_directories(BEFORE /usr/local/lib)
else()
    list(APPEND SWOOLE_LINK_LIBRARIES rt crypt)
endif()

find_package(PkgConfig REQUIRED)

if (UNIX AND NOT APPLE)
    find_library(URING_LIBRARIES uring)
    if (URING_LIBRARIES)
        message(STATUS "Found iouring")
        list(APPEND SWOOLE_LINK_LIBRARIES ${URING_LIBRARIES})
    else()
        message(WARNING "liburing not found.")
    endif()
endif()

if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
endif ()

# Code Coverage Configuration
add_library(coverage_config INTERFACE)

option(CODE_COVERAGE "Enable coverage reporting" OFF)
if(CODE_COVERAGE)
    message(STATUS "Open coverage")
    # --coverage => -fprofile-arcs -ftest-coverage
    target_compile_options(coverage_config INTERFACE
        -O0
        -g
        -fprofile-update=atomic
        --coverage
    )
    if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
        target_link_options(coverage_config INTERFACE --coverage)
    else()
        target_link_libraries(coverage_config INTERFACE --coverage)
    endif()
endif(CODE_COVERAGE)

file(GLOB_RECURSE SRC_LIST FOLLOW_SYMLINKS src/*.c src/*.cc
            thirdparty/boost/asm/combined.S
            thirdparty/hiredis/alloc.c
            thirdparty/hiredis/async.c
            thirdparty/hiredis/hiredis.c
            thirdparty/hiredis/net.c
            thirdparty/hiredis/read.c
            thirdparty/hiredis/sds.c
            thirdparty/llhttp/api.c
            thirdparty/llhttp/http.c
            thirdparty/llhttp/llhttp.c
        	thirdparty/multipart_parser.c
)
file(GLOB_RECURSE HEAD_FILES FOLLOW_SYMLINKS include/*.h)
file(GLOB_RECURSE HEAD_WAPPER_FILES FOLLOW_SYMLINKS include/wrapper/*.hpp)

set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

#message(STATUS "source=${SRC_LIST}")
#message(STATUS "header=${HEAD_FILES}")

add_definitions(-DHAVE_CONFIG_H)
# test
#add_definitions(-DSW_USE_THREAD_CONTEXT)

include_directories(BEFORE ./include ./include/wrapper ext-src/ thirdparty/ thirdparty/llhttp ./)

# find OpenSSL
if (DEFINED openssl_dir)
    include_directories(BEFORE ${openssl_dir}/include)
    link_directories(${openssl_dir}/lib)
else()
    find_package(OpenSSL)
    if (${OPENSSL_FOUND})
        message(STATUS "Found OpenSSL, ${OPENSSL_LIBRARIES}")
        include_directories(BEFORE ${OPENSSL_INCLUDE_DIR})
        list(APPEND SWOOLE_LINK_LIBRARIES ssl crypto)
    else()
        message(STATUS "Not found OpenSSL")
    endif()
endif()

if (DEFINED brotli_dir)
    include_directories(BEFORE ${brotli_dir}/include)
    link_directories(${brotli_dir}/lib)
endif()

foreach (LINE ${SWOOLE_CONFIG_FILE})
  if ("${LINE}" MATCHES "define SW_USE_CARES 1")
      message(STATUS "enable c-ares")
      list(APPEND SWOOLE_LINK_LIBRARIES cares)
  endif()
endforeach()

if (DEFINED enable_trace_log)
	add_definitions(-DSW_LOG_TRACE_OPEN)
endif()

if (DEFINED enable_asan)
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
    add_definitions(-DSW_USE_ASAN)
endif()

if (DEFINED enable_thread)
    add_definitions(-DSW_THREAD)
endif()

if (DEFINED async_io)
    # This macro is exclusively used for kernel unit testing to
    # verify the asynchronous operation functionality of the file thread pool.
    add_definitions(-DSW_USE_ASYNC)
endif()

if (DEFINED verbose)
    add_definitions(-DSW_VERBOSE)
endif()

set(php_dir "" CACHE STRING "Set the root directory of PHP")

if (DEFINED php_dir)
    set(PHP_CONFIG "${php_dir}/bin/php-config")
else ()
    set(PHP_CONFIG "php-config")
endif()

execute_process(COMMAND ${PHP_CONFIG} --includes OUTPUT_VARIABLE PHP_INCLUDES OUTPUT_STRIP_TRAILING_WHITESPACE  RESULT_VARIABLE PHP_CONFIG_RESULT)
if (NOT PHP_CONFIG_RESULT EQUAL 0)
    message(FATAL_ERROR "Failed to execute php-config: ${PHP_CONFIG_RESULT}")
endif()

execute_process(COMMAND ${PHP_CONFIG} --extension-dir OUTPUT_VARIABLE PHP_EXTENSION_DIR OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE PHP_CONFIG_RESULT)
if (NOT PHP_CONFIG_RESULT EQUAL 0)
    message(FATAL_ERROR "Failed to execute php-config: ${PHP_CONFIG_RESULT}")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PHP_INCLUDES}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PHP_INCLUDES}")

if (CMAKE_SYSTEM_NAME MATCHES "Linux")
    execute_process(COMMAND ldconfig -p OUTPUT_VARIABLE LDCONFIG_LIST OUTPUT_STRIP_TRAILING_WHITESPACE)
    #message(STATUS LDCONFIG_LIST)
    if (LDCONFIG_LIST MATCHES brotlienc)
         list(APPEND SWOOLE_LINK_LIBRARIES brotlienc)
    endif()

    if (LDCONFIG_LIST MATCHES brotlidec)
        list(APPEND SWOOLE_LINK_LIBRARIES brotlidec)
    endif()
endif()

# lib-swoole
link_directories(${LIBRARY_OUTPUT_PATH})
add_library(lib-swoole SHARED ${SRC_LIST})
set_target_properties(lib-swoole PROPERTIES OUTPUT_NAME "swoole" VERSION ${SWOOLE_VERSION})
target_link_libraries(lib-swoole ${SWOOLE_LINK_LIBRARIES})

if (CODE_COVERAGE)
    target_link_libraries(lib-swoole coverage_config gcov)
endif(CODE_COVERAGE)

# test_server
set(TEST_SRC_LIST examples/cpp/test_server.cc)
add_executable(test_server ${TEST_SRC_LIST})
add_dependencies(test_server lib-swoole)
target_link_libraries(test_server swoole pthread)

# co
set(TEST_SRC_LIST examples/cpp/co.cc)
add_executable(co ${TEST_SRC_LIST})
add_dependencies(co lib-swoole)
target_link_libraries(co swoole)

# ext-swoole
file(GLOB ext_cxx_files ext-src/*.cc)
set(ext_src_list  ${ext_cxx_files}
        thirdparty/php/curl/interface.cc
        thirdparty/php/curl/multi.cc
        thirdparty/php84/curl/interface.cc
	    thirdparty/php84/curl/multi.cc	
	    thirdparty/php/sockets/multicast.cc
        thirdparty/php/sockets/sendrecvmsg.cc
        thirdparty/php/sockets/conversions.cc
        thirdparty/php/sockets/sockaddr_conv.cc
        thirdparty/php/standard/proc_open.cc
        thirdparty/php/standard/var_decoder.cc
	    thirdparty/nghttp2/nghttp2_hd.c
        thirdparty/nghttp2/nghttp2_rcbuf.c
        thirdparty/nghttp2/nghttp2_helper.c
        thirdparty/nghttp2/nghttp2_buf.c
        thirdparty/nghttp2/nghttp2_mem.c
        thirdparty/nghttp2/nghttp2_hd_huffman.c
        thirdparty/nghttp2/nghttp2_hd_huffman_data.c
    )
add_library(ext-swoole SHARED ${ext_src_list})
set_target_properties(ext-swoole PROPERTIES PREFIX "")
set_target_properties(ext-swoole PROPERTIES OUTPUT_NAME "swoole")
add_dependencies(ext-swoole lib-swoole)

# core-tests
pkg_check_modules(NGHTTP2 REQUIRED libnghttp2)
if (${NGHTTP2_FOUND})
    message(STATUS "Found nghttp2")
else()
    message(STATUS "Not found nghttp2")
endif()

# find GTest
find_package(GTest REQUIRED)
if (!${GTEST_FOUND})
    message(FATAL_ERROR "Not found GTest")
endif()
message(STATUS "Found GTest")

file(GLOB_RECURSE core_test_files core-tests/src/*.cpp thirdparty/llhttp/*.c)
add_executable(core-tests ${core_test_files})
add_dependencies(core-tests lib-swoole)
include_directories(BEFORE core-tests/include thirdparty thirdparty/hiredis thirdparty/llhttp/ ${GTEST_INCLUDE_DIRS} ${NGHTTP2_INCLUDE_DIR})
target_link_libraries(core-tests swoole pthread ssl crypto ${GTEST_BOTH_LIBRARIES} ${NGHTTP2_LIBRARIES})

# find libpq
if (DEFINED libpq_dir)
    include_directories(BEFORE ${libpq_dir}/include)
    link_directories(${libpq_dir}/lib)
else()
    pkg_check_modules(LIBPQ REQUIRED libpq)
    target_include_directories(ext-swoole PRIVATE ${LIBPQ_INCLUDE_DIRS})
endif()

target_link_libraries(ext-swoole swoole pq curl)

# install
INSTALL(TARGETS ext-swoole LIBRARY DESTINATION ${PHP_EXTENSION_DIR})
INSTALL(TARGETS lib-swoole LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
INSTALL(FILES ${HEAD_FILES} DESTINATION include/swoole)
INSTALL(FILES ${HEAD_WAPPER_FILES} DESTINATION include/swoole/wrapper)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/config.h DESTINATION include/swoole)


================================================
FILE: Dockerfile
================================================
# This Dockerfile is designed to create a debug version of the PHP and Swoole environment,
 # enabling ASAN (`--enable-address-sanitizer`) to facilitate debugging and analysis of runtime crashes.
FROM ubuntu:22.04
ARG PHP_VERSION=8.2.28
RUN apt update
RUN apt install -y g++ cmake automake wget pkg-config git xz-utils
RUN apt install -y libssl-dev libcurl4-openssl-dev libxml2-dev libzip-dev libsqlite3-dev libreadline-dev libonig-dev \
    libbz2-dev libffi-dev libxslt-dev unixodbc-dev libpq-dev libbrotli-dev libc-ares-dev

RUN mkdir /work
WORKDIR /work

RUN wget https://www.php.net/distributions/php-${PHP_VERSION}.tar.xz
RUN tar -xvf php-${PHP_VERSION}.tar.xz

COPY . /work/php-${PHP_VERSION}/ext/swoole

RUN cd php-${PHP_VERSION} && ./buildconf --force && \
    ./configure --enable-mbstring --with-curl --with-openssl \
    --enable-soap --enable-intl --enable-bcmath --enable-sockets \
    --with-pear --with-webp --with-jpeg --with-ffi \
    --enable-sysvsem --enable-sysvshm --enable-sysvmsg --with-zlib --with-bz2 --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-xsl \
    --without-pdo-sqlite \
    --enable-debug --enable-address-sanitizer \
    --enable-swoole \
    --enable-swoole-curl   \
    --enable-swoole-pgsql  \
    --enable-swoole-sqlite \
    --enable-mysqlnd \
    --enable-cares \
    --with-swoole-odbc=unixODBC,/usr \
    --enable-brotli && \
    make clean && make -j $(nproc) && make install

RUN php -v
RUN php -m
RUN php --ri swoole
RUN php --ri curl
RUN php --ri openssl
RUN cd /work/php-${PHP_VERSION} && make clean
RUN cd /work && rm php-${PHP_VERSION}.tar.xz && rm -rf php-${PHP_VERSION}/ext/swoole/.git
RUN rm -rf /var/lib/apt/lists/* /usr/bin/qemu-*-static


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright Tianfeng.Han [rango@swoole.com]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: Makefile.frag
================================================
swoole-build-coverage:
	CCACHE_DISABLE=1 EXTRA_CFLAGS="-fprofile-arcs -ftest-coverage" EXTRA_CXXFLAGS="-fprofile-arcs -ftest-coverage" $(MAKE)

swoole-test-coverage:
	CCACHE_DISABLE=1 EXTRA_CFLAGS="-fprofile-arcs -ftest-coverage" EXTRA_CXXFLAGS="-fprofile-arcs -ftest-coverage" $(MAKE) && $(MAKE) install && $(top_srcdir)/tests/start.sh $(top_srcdir)/tests

swoole-test-coverage-lcov: swoole-test-coverage
	lcov -c --directory $(top_srcdir)/.libs --output-file $(top_srcdir)/coverage.info

swoole-test-coverage-html: swoole-test-coverage-lcov
	genhtml $(top_srcdir)/coverage.info --output-directory=$(top_srcdir)/html


================================================
FILE: README.md
================================================
<h2 align=center>
<img width="200" height="120" alt="Swoole Logo" src="docs/swoole-logo.svg" /> <br />
    Swoole is an event-driven, asynchronous, coroutine-based concurrency library with high performance for PHP.
</h2>

[![Compiler Tests](https://github.com/swoole/swoole-src/actions/workflows/ext.yml/badge.svg)](https://github.com/swoole/swoole-src/actions/workflows/ext.yml)
[![Core Test](https://github.com/swoole/swoole-src/actions/workflows/core.yml/badge.svg)](https://github.com/swoole/swoole-src/actions/workflows/core.yml)
[![Unit Tests](https://github.com/swoole/swoole-src/actions/workflows/unit.yml/badge.svg)](https://github.com/swoole/swoole-src/actions/workflows/unit.yml)
[![Thread Support Tests](https://github.com/swoole/swoole-src/actions/workflows/thread.yml/badge.svg)](https://github.com/swoole/swoole-src/actions/workflows/thread.yml)
[![Linux io_uring Tests](https://github.com/swoole/swoole-src/actions/workflows/iouring.yml/badge.svg)](https://github.com/swoole/swoole-src/actions/workflows/iouring.yml)
[![Frameworks Tests](https://github.com/swoole/swoole-src/actions/workflows/framework.yml/badge.svg)](https://github.com/swoole/swoole-src/actions/workflows/framework.yml)

[![Twitter](https://badgen.net/badge/icon/twitter?icon=twitter&label)](https://twitter.com/phpswoole)
[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.swoole.dev)
[![Latest Release](https://img.shields.io/github/release/swoole/swoole-src.svg)](https://github.com/swoole/swoole-src/releases/)
[![License](https://badgen.net/github/license/swoole/swoole-src)](https://github.com/swoole/swoole-src/blob/master/LICENSE)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/11654/badge.svg)](https://scan.coverity.com/projects/swoole-swoole-src)
[![Codecov](https://codecov.io/gh/swoole/swoole-src/branch/master/graph/badge.svg)](https://codecov.io/gh/swoole/swoole-src)

## ⚙️ Quick Start

Run Swoole program by [Docker](https://github.com/swoole/docker-swoole)

```bash
docker run --rm phpswoole/swoole "php --ri swoole"
```

> For details on how to use it, see: [How to Use This Image](https://github.com/swoole/docker-swoole#how-to-use-this-image).

## Documentation
<https://wiki.swoole.com/>

### HTTP Service
```php
$http = new Swoole\Http\Server('127.0.0.1', 9501);
$http->set(['hook_flags' => SWOOLE_HOOK_ALL]);

$http->on('request', function ($request, $response) {
    $result = [];
    Co::join([
        go(function () use (&$result) {
            $result['google'] = file_get_contents("https://www.google.com/");
        }),
        go(function () use (&$result) {
            $result['taobao'] = file_get_contents("https://www.taobao.com/");
        })
    ]);
    $response->end(json_encode($result));
});

$http->start();
```

### Concurrency
```php
Co\run(function() {
    Co\go(function() {
        while(1) {
            sleep(1);
            $fp = stream_socket_client("tcp://127.0.0.1:8000", $errno, $errstr, 30);
            echo fread($fp, 8192), PHP_EOL;
        }
    });

    Co\go(function() {
        $fp = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
        while(1) {
            $conn = stream_socket_accept($fp);
            fwrite($conn, 'The local time is ' . date('n/j/Y g:i a'));
        }
    });

    Co\go(function() {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        while(true) {
            $redis->subscribe(['test'], function ($instance, $channelName, $message) {
                echo 'New redis message: '.$channelName, "==>", $message, PHP_EOL;
            });
        }
    });

    Co\go(function() {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $count = 0;
        while(true) {
            sleep(2);
            $redis->publish('test','hello, world, count='.$count++);
        }
    });
});
```

## Runtime Hook

**Swoole hooks the blocking io function of PHP at the `bottom layer` and `automatically` converts it to a non-blocking function, so that these functions can be called concurrently in coroutines.**

### Supported extension/functions

* `ext-curl` (Support `symfony` and `guzzle`)
* `ext-redis`
* `ext-mysqli`
* `ext-pdo_mysql`
* `ext-pdo_pgsql`
* `ext-pdo_sqlite`
* `ext-pdo_oracle`
* `ext-pdo_odbc`
* `stream functions` (e.g. `stream_socket_client`/`stream_socket_server`), Supports `TCP`/`UDP`/`UDG`/`Unix`/`SSL/TLS`/`FileSystem API`/`Pipe`
* `ext-sockets`
* `ext-soap`
* `sleep`/`usleep`/`time_sleep_until`
* `proc_open`
* `gethostbyname`/`shell_exec`/`exec`
* `fread`/`fopen`/`fsockopen`/`fwrite`/`flock`


## 🛠 Develop & Discussion

+ __IDE Helper & API__: <https://github.com/swoole/ide-helper>
+ __Twitter__: <https://twitter.com/phpswoole>
+ __Discord__: <https://discord.swoole.dev>
+ __中文社区__: <https://wiki.swoole.com/#/other/discussion>

## 💎 Awesome Swoole
Project [Awesome Swoole](https://github.com/swoole/awesome-swoole) maintains a curated list of awesome things related to Swoole, including

* Swoole-based frameworks and libraries.
* Packages to integrate Swoole with popular PHP frameworks, including Laravel, Symfony, Slim, and Yii.
* Books, videos, and other learning materials about Swoole.
* Debugging, profiling, and testing tools for developing Swoole-based applications.
* Coroutine-friendly packages and libraries.
* Other Swoole related projects and resources.

## ✨ Event-based

The network layer in Swoole is event-based and takes full advantage of the underlying epoll/kqueue implementation, making it really easy to serve millions of requests.

Swoole 4.x uses a brand new engine kernel and now it has a full-time developer team, so we are entering an unprecedented period in PHP history which offers a unique possibility for rapid evolution in performance.

## ⚡ Coroutine

Swoole 4.x or later supports the built-in coroutine with high availability, and you can use fully synchronized code to implement asynchronous performance. PHP code without any additional keywords, the underlying automatic coroutine-scheduling.

Developers can understand coroutines as ultra-lightweight threads, and you can easily create thousands of coroutines in a single process.

### MySQL

Concurrency 10K requests to read data from MySQL takes only 0.2s!

```php
$s = microtime(true);
Co\run(function() {
    for ($c = 100; $c--;) {
        go(function () {
            $mysql = new Swoole\Coroutine\MySQL;
            $mysql->connect([
                'host' => '127.0.0.1',
                'user' => 'root',
                'password' => 'root',
                'database' => 'test'
            ]);
            $statement = $mysql->prepare('SELECT * FROM `user`');
            for ($n = 100; $n--;) {
                $result = $statement->execute();
                assert(count($result) > 0);
            }
        });
    }
});
echo 'use ' . (microtime(true) - $s) . ' s';
```

### Mixed server

You can create multiple services on the single event loop: TCP, HTTP, Websocket and HTTP2, and easily handle thousands of requests.

```php
function tcp_pack(string $data): string
{
    return pack('N', strlen($data)) . $data;
}
function tcp_unpack(string $data): string
{
    return substr($data, 4, unpack('N', substr($data, 0, 4))[1]);
}
$tcp_options = [
    'open_length_check' => true,
    'package_length_type' => 'N',
    'package_length_offset' => 0,
    'package_body_offset' => 4
];
```

```php
$server = new Swoole\WebSocket\Server('127.0.0.1', 9501, SWOOLE_BASE);
$server->set(['open_http2_protocol' => true]);
// http && http2
$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
    $response->end('Hello ' . $request->rawcontent());
});
// websocket
$server->on('message', function (Swoole\WebSocket\Server $server, Swoole\WebSocket\Frame $frame) {
    $server->push($frame->fd, 'Hello ' . $frame->data);
});
// tcp
$tcp_server = $server->listen('127.0.0.1', 9502, SWOOLE_TCP);
$tcp_server->set($tcp_options);
$tcp_server->on('receive', function (Swoole\Server $server, int $fd, int $reactor_id, string $data) {
    $server->send($fd, tcp_pack('Hello ' . tcp_unpack($data)));
});
$server->start();
```

### Coroutine clients

Whether you DNS query or send requests or receive responses, all of these are scheduled by coroutine automatically.

```php
go(function () {
    // http
    $http_client = new Swoole\Coroutine\Http\Client('127.0.0.1', 9501);
    assert($http_client->post('/', 'Swoole Http'));
    var_dump($http_client->body);
    // websocket
    $http_client->upgrade('/');
    $http_client->push('Swoole Websocket');
    var_dump($http_client->recv()->data);
});
go(function () {
    // http2
    $http2_client = new Swoole\Coroutine\Http2\Client('localhost', 9501);
    $http2_client->connect();
    $http2_request = new Swoole\Http2\Request;
    $http2_request->method = 'POST';
    $http2_request->data = 'Swoole Http2';
    $http2_client->send($http2_request);
    $http2_response = $http2_client->recv();
    var_dump($http2_response->data);
});
go(function () use ($tcp_options) {
    // tcp
    $tcp_client = new Swoole\Coroutine\Client(SWOOLE_TCP);
    $tcp_client->set($tcp_options);
    $tcp_client->connect('127.0.0.1', 9502);
    $tcp_client->send(tcp_pack('Swoole Tcp'));
    var_dump(tcp_unpack($tcp_client->recv()));
});
```

### Channel

Channel is the only way for exchanging data between coroutines, the development combination of the `Coroutine + Channel` is the famous CSP programming model.

In Swoole development, Channel is usually used for implementing connection pool or scheduling coroutine concurrent.

#### The simplest example of a connection pool

In the following example, we have a thousand concurrently requests to redis. Normally, this has exceeded the maximum number of Redis connections setting and will throw a connection exception, but the connection pool based on Channel can perfectly schedule requests. We don't have to worry about connection overload.

```php
class RedisPool
{
    /**@var \Swoole\Coroutine\Channel */
    protected $pool;

    /**
     * RedisPool constructor.
     * @param int $size max connections
     */
    public function __construct(int $size = 100)
    {
        $this->pool = new \Swoole\Coroutine\Channel($size);
        for ($i = 0; $i < $size; $i++) {
            $redis = new \Swoole\Coroutine\Redis();
            $res = $redis->connect('127.0.0.1', 6379);
            if ($res == false) {
                throw new \RuntimeException("failed to connect redis server.");
            } else {
                $this->put($redis);
            }
        }
    }

    public function get(): \Swoole\Coroutine\Redis
    {
        return $this->pool->pop();
    }

    public function put(\Swoole\Coroutine\Redis $redis)
    {
        $this->pool->push($redis);
    }

    public function close(): void
    {
        $this->pool->close();
        $this->pool = null;
    }
}

go(function () {
    $pool = new RedisPool();
    // max concurrency num is more than max connections
    // but it's no problem, channel will help you with scheduling
    for ($c = 0; $c < 1000; $c++) {
        go(function () use ($pool, $c) {
            for ($n = 0; $n < 100; $n++) {
                $redis = $pool->get();
                assert($redis->set("awesome-{$c}-{$n}", 'swoole'));
                assert($redis->get("awesome-{$c}-{$n}") === 'swoole');
                assert($redis->delete("awesome-{$c}-{$n}"));
                $pool->put($redis);
            }
        });
    }
});
```

#### Producer and consumers

Some Swoole's clients implement the defer mode for concurrency, but you can still implement it flexible with a combination of coroutines and channels.

```php
go(function () {
    // User: I need you to bring me some information back.
    // Channel: OK! I will be responsible for scheduling.
    $channel = new Swoole\Coroutine\Channel;
    go(function () use ($channel) {
        // Coroutine A: Ok! I will show you the github addr info
        $addr_info = Co::getaddrinfo('github.com');
        $channel->push(['A', json_encode($addr_info, JSON_PRETTY_PRINT)]);
    });
    go(function () use ($channel) {
        // Coroutine B: Ok! I will show you what your code look like
        $mirror = Co::readFile(__FILE__);
        $channel->push(['B', $mirror]);
    });
    go(function () use ($channel) {
        // Coroutine C: Ok! I will show you the date
        $channel->push(['C', date(DATE_W3C)]);
    });
    for ($i = 3; $i--;) {
        list($id, $data) = $channel->pop();
        echo "From {$id}:\n {$data}\n";
    }
    // User: Amazing, I got every information at earliest time!
});
```

### Timer

```php
$id = Swoole\Timer::tick(100, function () {
    echo "⚙️ Do something...\n";
});
Swoole\Timer::after(500, function () use ($id) {
    Swoole\Timer::clear($id);
    echo "⏰ Done\n";
});
Swoole\Timer::after(1000, function () use ($id) {
    if (!Swoole\Timer::exists($id)) {
        echo "✅ All right!\n";
    }
});
```
#### The way of coroutine

```php
go(function () {
    $i = 0;
    while (true) {
        Co::sleep(0.1);
        echo "📝 Do something...\n";
        if (++$i === 5) {
            echo "🛎 Done\n";
            break;
        }
    }
    echo "🎉 All right!\n";
});
```

## 🔥 Amazing runtime hooks

**As of Swoole v4.1.0, we added the ability to transform synchronous PHP network libraries into co-routine libraries using a single line of code.**

Simply call the `Swoole\Runtime::enableCoroutine()` method at the top of your script. In the sample below we connect to php-redis and concurrently read 10k requests in 0.1s:

```php
Swoole\Runtime::enableCoroutine();
$s = microtime(true);
Co\run(function() {
    for ($c = 100; $c--;) {
        go(function () {
            ($redis = new Redis)->connect('127.0.0.1', 6379);
            for ($n = 100; $n--;) {
                assert($redis->get('awesome') === 'swoole');
            }
        });
    }
});
echo 'use ' . (microtime(true) - $s) . ' s';
```

By calling this method, the Swoole kernel replaces ZendVM stream function pointers. If you use `php_stream` based extensions, all socket operations can be dynamically converted to be asynchronous IO scheduled by coroutine at runtime!

### How many things you can do in 1s?

Sleep 10K times, read, write, check and delete files 10K times, use PDO and MySQLi to communicate with the database 10K times, create a TCP server and multiple clients to communicate with each other 10K times, create a UDP server and multiple clients to communicate with each other 10K times... Everything works well in one process!

Just see what the Swoole brings, just imagine...

```php
Swoole\Runtime::enableCoroutine();
$s = microtime(true);
Co\run(function() {
    // i just want to sleep...
    for ($c = 100; $c--;) {
        go(function () {
            for ($n = 100; $n--;) {
                usleep(1000);
            }
        });
    }

    // 10K file read and write
    for ($c = 100; $c--;) {
        go(function () use ($c) {
            $tmp_filename = "/tmp/test-{$c}.php";
            for ($n = 100; $n--;) {
                $self = file_get_contents(__FILE__);
                file_put_contents($tmp_filename, $self);
                assert(file_get_contents($tmp_filename) === $self);
            }
            unlink($tmp_filename);
        });
    }

    // 10K pdo and mysqli read
    for ($c = 50; $c--;) {
        go(function () {
            $pdo = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8', 'root', 'root');
            $statement = $pdo->prepare('SELECT * FROM `user`');
            for ($n = 100; $n--;) {
                $statement->execute();
                assert(count($statement->fetchAll()) > 0);
            }
        });
    }
    for ($c = 50; $c--;) {
        go(function () {
            $mysqli = new Mysqli('127.0.0.1', 'root', 'root', 'test');
            $statement = $mysqli->prepare('SELECT `id` FROM `user`');
            for ($n = 100; $n--;) {
                $statement->bind_result($id);
                $statement->execute();
                $statement->fetch();
                assert($id > 0);
            }
        });
    }

    // php_stream tcp server & client with 12.8K requests in single process
    function tcp_pack(string $data): string
    {
        return pack('n', strlen($data)) . $data;
    }

    function tcp_length(string $head): int
    {
        return unpack('n', $head)[1];
    }

    go(function () {
        $ctx = stream_context_create(['socket' => ['so_reuseaddr' => true, 'backlog' => 128]]);
        $socket = stream_socket_server(
            'tcp://0.0.0.0:9502',
            $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $ctx
        );
        if (!$socket) {
            echo "$errstr ($errno)\n";
        } else {
            $i = 0;
            while ($conn = stream_socket_accept($socket, 1)) {
                stream_set_timeout($conn, 5);
                for ($n = 100; $n--;) {
                    $data = fread($conn, tcp_length(fread($conn, 2)));
                    assert($data === "Hello Swoole Server #{$n}!");
                    fwrite($conn, tcp_pack("Hello Swoole Client #{$n}!"));
                }
                if (++$i === 128) {
                    fclose($socket);
                    break;
                }
            }
        }
    });
    for ($c = 128; $c--;) {
        go(function () {
            $fp = stream_socket_client("tcp://127.0.0.1:9502", $errno, $errstr, 1);
            if (!$fp) {
                echo "$errstr ($errno)\n";
            } else {
                stream_set_timeout($fp, 5);
                for ($n = 100; $n--;) {
                    fwrite($fp, tcp_pack("Hello Swoole Server #{$n}!"));
                    $data = fread($fp, tcp_length(fread($fp, 2)));
                    assert($data === "Hello Swoole Client #{$n}!");
                }
                fclose($fp);
            }
        });
    }

    // udp server & client with 12.8K requests in single process
    go(function () {
        $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_DGRAM, 0);
        $socket->bind('127.0.0.1', 9503);
        $client_map = [];
        for ($c = 128; $c--;) {
            for ($n = 0; $n < 100; $n++) {
                $recv = $socket->recvfrom($peer);
                $client_uid = "{$peer['address']}:{$peer['port']}";
                $id = $client_map[$client_uid] = ($client_map[$client_uid] ?? -1) + 1;
                assert($recv === "Client: Hello #{$id}!");
                $socket->sendto($peer['address'], $peer['port'], "Server: Hello #{$id}!");
            }
        }
        $socket->close();
    });
    for ($c = 128; $c--;) {
        go(function () {
            $fp = stream_socket_client("udp://127.0.0.1:9503", $errno, $errstr, 1);
            if (!$fp) {
                echo "$errstr ($errno)\n";
            } else {
                for ($n = 0; $n < 100; $n++) {
                    fwrite($fp, "Client: Hello #{$n}!");
                    $recv = fread($fp, 1024);
                    list($address, $port) = explode(':', (stream_socket_get_name($fp, true)));
                    assert($address === '127.0.0.1' && (int)$port === 9503);
                    assert($recv === "Server: Hello #{$n}!");
                }
                fclose($fp);
            }
        });
    }
});
echo 'use ' . (microtime(true) - $s) . ' s';
```

## ⌛️ Installation

> As with any open source project, Swoole always provides the most reliable stability and the most powerful features in **the latest released version**. Please ensure as much as possible that you are using the latest version.

### Compiling requirements

+ Linux, OS X or Cygwin, WSL
+ PHP 8.1.0 or later (The higher the version, the better the performance.)
+ GCC 4.8 or later

### 1. Install via PECL (beginners)

```shell
pecl install swoole
```

### 2. Install from source (recommended)

Please download the source packages from [Releases](https://github.com/swoole/swoole-src/releases) or clone a specific version. Don't use `master` branch as it may be in development.

To clone the source code from git specify a tag:
```shell
git clone --branch v6.0.0 --single-branch https://github.com/swoole/swoole-src.git && \
cd swoole-src
```

Compile and install at the source folder:

```shell
phpize && \
./configure && \
make && make install
```

#### Enable extension in PHP

After compiling and installing to the system successfully, you have to add a new line `extension=swoole.so` to `php.ini` to enable Swoole extension.

#### Extra compiler configurations

> for example: `./configure --enable-openssl --enable-sockets`

+ `--enable-openssl` or `--with-openssl-dir=DIR`
+ `--enable-sockets`
+ `--enable-mysqlnd` (need mysqlnd, it just for supporting `$mysql->escape` method)
+ `--enable-swoole-curl`

### Upgrade

>  ⚠️ If you upgrade from source, don't forget to `make clean` before you upgrade your swoole

1. `pecl upgrade swoole`
2. `cd swoole-src && git pull && make clean && make && sudo make install`
3. if you change your PHP version, please re-run `phpize clean && phpize` then try to compile

### Major change since version 4.3.0

Async clients and API are moved to a separate PHP extension `swoole_async` since version 4.3.0, install `swoole_async`:

```shell
git clone https://github.com/swoole/ext-async.git
cd ext-async
phpize
./configure
make -j 4
sudo make install
```

Enable it by adding a new line `extension=swoole_async.so` to `php.ini`.

## 🍭 Benchmark

+ On the open source [Techempower Web Framework benchmarks](https://www.techempower.com/benchmarks/#section=data-r17) Swoole used MySQL database benchmark to rank first, and all performance tests ranked in the first echelon.
+ You can just run [Benchmark Script](https://github.com/swoole/benchmark/blob/master/benchmark.php) to quickly test the maximum QPS of Swoole-HTTP-Server on your machine.

## 🔰️ Security issues

Security issues should be reported privately, via email, to the Swoole develop team [team@swoole.com](mailto:team@swoole.com). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message.

## 🖊️ Contribution

Your contribution to Swoole development is very welcome!

You may contribute in the following ways:

* [Report issues and feedback](https://github.com/swoole/swoole-src/issues)
* Submit fixes, features via Pull Request
* Write/polish documentation

## ❤️ Contributors

This project exists thanks to all the people who contribute. [[Contributors](https://github.com/swoole/swoole-src/graphs/contributors)].
<a href="https://github.com/swoole/swoole-src/graphs/contributors"><img src="https://opencollective.com/swoole-src/contributors.svg?width=890&button=false" /></a>

## 🎙️ Official Evangelist

[Demin](https://deminy.in) has been playing with PHP since 2000, focusing on building high-performance, secure web services. He is an occasional conference speaker on PHP and Swoole, and has been working for companies in the states like eBay, Visa and Glu Mobile for years. You may find Demin on [Twitter](https://twitter.com/deminy) or [GitHub](https://github.com/deminy).

## 📃 License

Apache License Version 2.0 see http://www.apache.org/licenses/LICENSE-2.0.html


================================================
FILE: codecov.yml
================================================
ignore:
  - "src/core/error.cc"
  - "thirdparty/hiredis/*"
  - "thirdparty/llhttp/*"

coverage:
  range: 60..80
  round: down
  precision: 2


================================================
FILE: composer.json
================================================
{
  "name": "swoole/swoole",
  "type": "php-ext",
  "license": "Apache-2.0",
  "description": "Swoole is an event-driven, asynchronous, coroutine-based concurrency library with high performance for PHP.",
  "require": {
    "php": ">=8.2 <8.6",
    "ext-pdo": "*"
  },
  "suggest": {
    "ext-pdo_mysql": "PDO_MYSQL is required for Swoole to work with MySQL",
    "ext-pdo_pgsql": "PDO_PGSQL is required for Swoole to work with PostgreSQL",
    "ext-curl": "CURL is required for Swoole to work with HTTP",
    "ext-sockets": "Sockets is required for Swoole to work with Socket",
    "ext-openssl": "OpenSSL is required for Swoole to work with HTTPS",
    "ext-posix": "*"
  },
  "php-ext": {
    "extension-name": "swoole",
    "configure-options": [
      {
        "name": "enable-sockets",
        "description": "Enable sockets support"
      },
      {
        "name": "with-openssl-dir",
        "description": "Specify openssl installation directory (requires OpenSSL 1.1.0 or later)?",
        "needs-value": true
      },
      {
        "name": "enable-mysqlnd",
        "description": "Enable mysqlnd support"
      },
      {
        "name": "enable-swoole-curl",
        "description": "Enable curl support"
      },
      {
        "name": "enable-cares",
        "description": "Enable cares support"
      },
      {
        "name": "enable-brotli",
        "description": "Enable brotli support"
      },
      {
        "name": "with-brotli-dir",
        "description": "Specify brotli installation directory?",
        "needs-value": true
      },
      {
        "name": "enable-swoole-pgsql",
        "description": "Enable PostgreSQL database support"
      },
      {
        "name": "with-swoole-odbc",
        "description": "Enable ODBC database support",
        "needs-value": true
      },
      {
        "name": "with-swoole-oracle",
        "description": "Enable Oracle database support",
        "needs-value": true
      },
      {
        "name": "enable-swoole-sqlite",
        "description": "Enable Sqlite database support"
      },
      {
        "name": "with-swoole-firebird",
        "description": "Enable Firebird database support",
        "needs-value": true
      },
      {
        "name": "enable-swoole-thread",
        "description": "Enable swoole thread support (need php zts support)"
      },
      {
        "name": "enable-iouring",
        "description": "Enable iouring for file async support"
      },
      {
        "name": "with-liburing-dir",
        "description": "Specify liburing installation directory (requires liburing 2.8 or later)",
        "needs-value": true
      },
      {
        "name": "enable-uring-socket",
        "description": "Enable iouring for http coroutine server support"
      },
      {
        "name": "with-swoole-ssh2",
        "description": "Enable async ssh2 client support",
        "needs-value": true
      },
      {
        "name": "enable-swoole-ftp",
        "description": "Enable async ssh2 client support"
      },
      {
        "name": "enable-zstd",
        "description": "Enable zstd support (requires zstd 1.4.0 or later)"
      }
    ]
  }
}


================================================
FILE: config.m4
================================================
dnl $Id$
dnl config.m4 for extension swoole

dnl  +----------------------------------------------------------------------+
dnl  | Swoole                                                               |
dnl  +----------------------------------------------------------------------+
dnl  | This source file is subject to version 2.0 of the Apache license,    |
dnl  | that is bundled with this package in the file LICENSE, and is        |
dnl  | available through the world-wide-web at the following url:           |
dnl  | http://www.apache.org/licenses/LICENSE-2.0.html                      |
dnl  | If you did not receive a copy of the Apache2.0 license and are unable|
dnl  | to obtain it through the world-wide-web, please send a note to       |
dnl  | license@swoole.com so we can mail you a copy immediately.            |
dnl  +----------------------------------------------------------------------+
dnl  | Author: Tianfeng Han  <rango@swoole.com>                             |
dnl  | Author: Twosee  <twose@qq.com>                                       |
dnl  +----------------------------------------------------------------------+

PHP_ARG_ENABLE([debug-log],
  [enable debug log],
  [AS_HELP_STRING([--enable-debug-log],
    [Enable swoole debug log])], [no], [no])

PHP_ARG_ENABLE([trace-log],
  [enable trace log],
  [AS_HELP_STRING([--enable-trace-log],
    [Enable swoole trace log])], [no], [no])

PHP_ARG_ENABLE([sockets],
  [enable sockets support],
  [AS_HELP_STRING([--enable-sockets],
    [Do you have sockets extension?])], [no], [no])

PHP_ARG_ENABLE([swoole],
  [swoole support],
  [AS_HELP_STRING([--enable-swoole],
    [Enable swoole support])], [enable_swoole="yes"])

PHP_ARG_ENABLE([mysqlnd],
  [enable mysqlnd support],
  [AS_HELP_STRING([--enable-mysqlnd],
    [Enable mysqlnd])], [no], [no])

PHP_ARG_ENABLE([cares],
  [enable c-ares support],
  [AS_HELP_STRING([--enable-cares],
    [Enable cares])], [no], [no])

PHP_ARG_ENABLE([iouring],
  [enable io-uring support],
  [AS_HELP_STRING([--enable-iouring],
    [Enable io-uring])], [no], [no])
    
PHP_ARG_WITH([liburing_dir],
  [dir of liburing],
  [AS_HELP_STRING([[--with-liburing-dir[=DIR]]],
    [Include liburing support (requires liburing >= 2.13)])], [no], [no])
    
PHP_ARG_ENABLE([uring_socket],
  [enable uring_socket support],
  [AS_HELP_STRING([--enable-uring-socket],
    [Enable iouring socket support])], [no], [no])

PHP_ARG_WITH([openssl_dir],
  [dir of openssl],
  [AS_HELP_STRING([[--with-openssl-dir[=DIR]]],
    [Include OpenSSL support (requires OpenSSL >= 1.1.0)])], [no], [no])

PHP_ARG_ENABLE([brotli],
  [enable brotli support],
  [AS_HELP_STRING([[--enable-brotli]],
    [Use brotli])], [auto], [no])

PHP_ARG_WITH([brotli_dir],
  [dir of brotli],
  [AS_HELP_STRING([[--with-brotli-dir[=DIR]]],
    [Include Brotli support])], [no], [no])

PHP_ARG_ENABLE([zstd],
  [enable zstd support],
  [AS_HELP_STRING([[--enable-zstd]],
    [Use zstd])], [no], [no])

PHP_ARG_WITH([nghttp2_dir],
  [dir of nghttp2],
  [AS_HELP_STRING([[--with-nghttp2-dir[=DIR]]],
    [Include nghttp2 support])], [no], [no])

PHP_ARG_ENABLE([asan],
  [enable asan],
  [AS_HELP_STRING([--enable-asan],
    [Enable asan])], [no], [no])

PHP_ARG_ENABLE([swoole-coverage],
  [whether to enable swoole coverage support],
  [AS_HELP_STRING([--enable-swoole-coverage],
    [Enable swoole coverage support])], [no], [no])

PHP_ARG_ENABLE([swoole-dev],
  [whether to enable Swoole developer build flags],
  [AS_HELP_STRING([--enable-swoole-dev],
    [Enable developer flags])], [no], [no])

PHP_ARG_ENABLE([swoole-curl],
  [whether to enable Swoole CURL build flags],
  [AS_HELP_STRING([--enable-swoole-curl],
    [Enable cURL support])], [no], [no])

PHP_ARG_ENABLE([swoole-pgsql],
  [whether to enable postgresql build flags],
  [AS_HELP_STRING([--enable-swoole-pgsql],
    [Enable postgresql support])], [no], [no])

PHP_ARG_WITH([swoole-firebird],
  [whether to enable firebird build flags],
  [AS_HELP_STRING([[--with-swoole-firebird[=DIR]]],
    [PDO: Async Firebird support. DIR is the Firebird base install directory
    [/opt/firebird]])], [no], [no])

PHP_ARG_WITH([swoole-ssh2],
  [whether to enable ssh2 support],
  [AS_HELP_STRING([[--with-swoole-ssh2[=DIR]]],
    [Enable Async ssh2 support. DIR is the libssh2 base install directory
    [/usr]])], [no], [no])

PHP_ARG_ENABLE([swoole-ftp],
  [whether to enable Async FTP support],
  [AS_HELP_STRING([--enable-swoole-ftp],
    [Enable Async FTP support])], [no], [no])

PHP_ARG_ENABLE([thread-context],
  [whether to enable thread context],
  [AS_HELP_STRING([--enable-thread-context],
    [Use thread context])], [no], [no])

PHP_ARG_ENABLE([swoole-thread],
  [whether to enable swoole thread support],
  [AS_HELP_STRING([--enable-swoole-thread],
    [Enable swoole thread support])], [no], [no])

PHP_ARG_ENABLE([swoole-stdext],
  [whether to enable swoole stdext support],
  [AS_HELP_STRING([--enable-swoole-stdext],
    [Enable swoole stdext support("[Experimental] This module is only used for swoole-cli.
     If you are unsure which feature you need, keep it disabled")])], [no], [no])

PHP_ARG_ENABLE([swoole-coro-time],
  [whether to enable coroutine execution time ],
  [AS_HELP_STRING([--enable-swoole-coro-time],
    [Calculating coroutine execution time])], [no], [no])

define([PDO_ODBC_HELP_TEXT],[[
  The include and lib dirs are looked for under 'dir'. The 'flavour' can be one
  of: ibm-db2, iODBC, unixODBC, generic. If ',dir' part is omitted, default for
  the flavour you have selected will be used. e.g.: --with-swoole-odbc=unixODBC
  will check for unixODBC under /usr/local. You may attempt to use an otherwise
  unsupported driver using the 'generic' flavour. The syntax for generic ODBC
  support is: --with-swoole-odbc=generic,dir,libname,ldflags,cflags. When built as
  'shared' the extension filename is always pdo_odbc.so]])

PHP_ARG_WITH([swoole-odbc],
  ["for ODBC v3 support for PDO"],
  [AS_HELP_STRING([--with-swoole-odbc=flavour,dir],
    ["PDO: Support for 'flavour' ODBC driver."]PDO_ODBC_HELP_TEXT)], [no], [no])

AC_DEFUN([PDO_ODBC_CHECK_HEADER],[
  AC_MSG_CHECKING([for $1 in $PDO_ODBC_INCDIR])
  if test -f "$PDO_ODBC_INCDIR/$1"; then
    php_pdo_have_header=yes
    AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_$1]), [1],
      [Define to 1 if you have the <$1> header file.])
    AC_MSG_RESULT(yes)
  else
    AC_MSG_RESULT(no)
  fi
])

AC_DEFUN([SWOOLE_HAVE_PHP_EXT], [
    extname=$1
    haveext=$[PHP_]translit($1,a-z_-,A-Z__)

    AC_MSG_CHECKING([for ext/$extname support])
    if test -x "$PHP_EXECUTABLE"; then
        grepext=`$PHP_EXECUTABLE -m | $EGREP ^$extname\$`
        if test "$grepext" = "$extname"; then
            [PHP_HTTP_HAVE_EXT_]translit($1,a-z_-,A-Z__)=1
            AC_MSG_RESULT([yes])
            $2
        else
            [PHP_HTTP_HAVE_EXT_]translit($1,a-z_-,A-Z__)=
            AC_MSG_RESULT([no])
            $3
        fi
    elif test "$haveext" != "no" && test "x$haveext" != "x"; then
        [PHP_HTTP_HAVE_EXT_]translit($1,a-z_-,A-Z__)=1
        AC_MSG_RESULT([yes])
        $2
    else
        [PHP_HTTP_HAVE_EXT_]translit($1,a-z_-,A-Z__)=
        AC_MSG_RESULT([no])
        $3
    fi
])

AC_DEFUN([AC_SWOOLE_CPU_AFFINITY],
[
    AC_MSG_CHECKING([for cpu affinity])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #ifdef __FreeBSD__
        #include <sys/types.h>
        #include <sys/cpuset.h>
        typedef cpuset_t cpu_set_t;
        #else
        #define _GNU_SOURCE 1
        #include <sched.h>
        #endif
    ]], [[
        cpu_set_t cpu_set;
        CPU_ZERO(&cpu_set);
    ]])],[
        AC_DEFINE([HAVE_CPU_AFFINITY], 1, [cpu affinity?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
])

AC_DEFUN([AC_SWOOLE_HAVE_REUSEPORT],
[
    AC_MSG_CHECKING([for socket REUSEPORT])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #include <sys/socket.h>
    ]], [[
        int val = 1;
        setsockopt(0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
    ]])],[
        AC_DEFINE([HAVE_REUSEPORT], 1, [have SO_REUSEPORT?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
])

AC_DEFUN([AC_SWOOLE_HAVE_FUTEX],
[
    AC_MSG_CHECKING([for futex])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #include <linux/futex.h>
        #include <syscall.h>
        #include <unistd.h>
    ]], [[
        int futex_addr;
        syscall(SYS_futex, &futex_addr, FUTEX_WAIT, NULL, NULL, 0);
    ]])],[
        AC_DEFINE([HAVE_FUTEX], 1, [have FUTEX?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
])

AC_DEFUN([AC_SWOOLE_HAVE_UCONTEXT],
[
    AC_MSG_CHECKING([for ucontext])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #define _XOPEN_SOURCE
        #include <stdio.h>
        #include <ucontext.h>
        #include <unistd.h>
    ]], [[
        ucontext_t context;
        getcontext(&context);
    ]])],[
        AC_DEFINE([HAVE_UCONTEXT], 1, [have ucontext?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
])

AC_DEFUN([AC_SWOOLE_HAVE_VALGRIND],
[
    AC_MSG_CHECKING([for valgrind])
    AC_LANG_PUSH([C++])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #include <valgrind/valgrind.h>
    ]], [[

    ]])],[
        AC_DEFINE([HAVE_VALGRIND], 1, [have valgrind?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
    AC_LANG_POP([C++])
])

AC_DEFUN([AC_SWOOLE_HAVE_BOOST_STACKTRACE],
[
    AC_MSG_CHECKING([for valgrind])
    AC_LANG_PUSH([C++])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #include <boost/stacktrace.hpp>
    ]], [[

    ]])],[
        AC_DEFINE([HAVE_BOOST_STACKTRACE], 1, [have boost-stacktrace?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
    AC_LANG_POP([C++])
])

AC_DEFUN([AC_SWOOLE_HAVE_IOURING_FUTEX],
[
    AC_MSG_CHECKING([for io_uring futex])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #define _GNU_SOURCE
        #include <liburing.h>
    ]], [[
        int op = IORING_OP_FUTEX_WAIT;
    ]])],[
        AC_DEFINE([HAVE_IOURING_FUTEX], 1, [have io_uring futex?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
])

AC_DEFUN([AC_SWOOLE_HAVE_IOURING_STATX],
[
    AC_MSG_CHECKING([for io_uring statx])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #define _GNU_SOURCE
        #include <sys/stat.h>
        #include <string.h>
        #include <liburing.h>
    ]], [[
        struct statx _statxbuf;
        memset(&_statxbuf, 0, sizeof(_statxbuf));
        int op = IORING_OP_STATX;
    ]])],[
        AC_DEFINE([HAVE_IOURING_STATX], 1, [have io_uring statx?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
])

AC_DEFUN([AC_SWOOLE_HAVE_IOURING_FTRUNCATE],
[
    AC_MSG_CHECKING([for io_uring ftruncate])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #define _GNU_SOURCE
        #include <liburing.h>
    ]], [[
        int op = IORING_OP_FTRUNCATE;
    ]])],[
        AC_DEFINE([HAVE_IOURING_FTRUNCATE], 1, [have io_uring ftruncate?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
])

AC_DEFUN([AC_SWOOLE_CHECK_SOCKETS], [
    AC_CHECK_FUNCS([hstrerror socketpair if_nametoindex if_indextoname])
    AC_CHECK_HEADERS([netdb.h netinet/tcp.h sys/un.h sys/sockio.h])
    AC_DEFINE([HAVE_SOCKETS], 1, [ ])

    dnl Check for AI_V4MAPPED flag
    AC_CACHE_CHECK([if getaddrinfo supports AI_V4MAPPED],[ac_cv_gai_ai_v4mapped],
    [
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <netdb.h>
    ]], [[int flag = AI_V4MAPPED;]])],
        [ac_cv_gai_ai_v4mapped=yes], [ac_cv_gai_ai_v4mapped=no])
    ])

    if test "$ac_cv_gai_ai_v4mapped" = yes; then
        AC_DEFINE(HAVE_AI_V4MAPPED,1,[Whether you have AI_V4MAPPED])
    fi

    dnl Check for AI_ALL flag
    AC_CACHE_CHECK([if getaddrinfo supports AI_ALL],[ac_cv_gai_ai_all],
    [
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <netdb.h>
    ]], [[int flag = AI_ALL;]])],
        [ac_cv_gai_ai_all=yes], [ac_cv_gai_ai_all=no])
    ])

    if test "$ac_cv_gai_ai_all" = yes; then
        AC_DEFINE(HAVE_AI_ALL,1,[Whether you have AI_ALL])
    fi

    dnl Check for AI_IDN flag
    AC_CACHE_CHECK([if getaddrinfo supports AI_IDN],[ac_cv_gai_ai_idn],
    [
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <netdb.h>
    ]], [[int flag = AI_IDN;]])],
            [ac_cv_gai_ai_idn=yes], [ac_cv_gai_ai_idn=no])
    ])

    if test "$ac_cv_gai_ai_idn" = yes; then
        AC_DEFINE(HAVE_AI_IDN,1,[Whether you have AI_IDN])
    fi
])

AC_DEFUN([AC_SWOOLE_HAVE_MSGQUEUE],
[
    AC_MSG_CHECKING([for sysv message queue])
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
        #include <sys/ipc.h>
        #include <sys/msg.h>
    ]], [[
        msgget(0x9501, IPC_CREAT);
    ]])],[
        AC_DEFINE([HAVE_MSGQUEUE], 1, [have sysv message queue?])
        AC_MSG_RESULT([yes])
    ],[
        AC_MSG_RESULT([no])
    ])
])

AC_MSG_CHECKING([if compiling with clang])
AC_COMPILE_IFELSE([
    AC_LANG_PROGRAM([], [[
        #ifndef __clang__
            not clang
        #endif
    ]])],
    [CLANG=yes], [CLANG=no]
)
AC_MSG_RESULT([$CLANG])

dnl AC_PROG_CC_C99 is obsolete with autoconf >= 2.70 yet necessary for <= 2.69.
m4_version_prereq([2.70],,[AC_PROG_CC_C99])

AC_CANONICAL_HOST

if test "$PHP_SWOOLE" != "no"; then

    AC_CHECK_LIB(c, accept4, AC_DEFINE(HAVE_ACCEPT4, 1, [have accept4]))
    AC_CHECK_LIB(c, signalfd, AC_DEFINE(HAVE_SIGNALFD, 1, [have signalfd]))
    AC_CHECK_LIB(c, eventfd, AC_DEFINE(HAVE_EVENTFD, 1, [have eventfd]))
    AC_CHECK_LIB(c, epoll_create, AC_DEFINE(HAVE_EPOLL, 1, [have epoll]))
    AC_CHECK_LIB(c, sendfile, AC_DEFINE(HAVE_SENDFILE, 1, [have sendfile]))
    AC_CHECK_LIB(c, kqueue, AC_DEFINE(HAVE_KQUEUE, 1, [have kqueue]))
    AC_CHECK_LIB(c, backtrace, AC_DEFINE(HAVE_EXECINFO, 1, [have execinfo]))
    AC_CHECK_LIB(c, daemon, AC_DEFINE(HAVE_DAEMON, 1, [have daemon]))
    AC_CHECK_LIB(c, mkostemp, AC_DEFINE(HAVE_MKOSTEMP, 1, [have mkostemp]))
    AC_CHECK_LIB(c, inotify_init, AC_DEFINE(HAVE_INOTIFY, 1, [have inotify]))
    AC_CHECK_LIB(c, malloc_trim, AC_DEFINE(HAVE_MALLOC_TRIM, 1, [have malloc_trim]))
    AC_CHECK_LIB(c, inotify_init1, AC_DEFINE(HAVE_INOTIFY_INIT1, 1, [have inotify_init1]))
    AC_CHECK_LIB(c, gethostbyname2_r, AC_DEFINE(HAVE_GETHOSTBYNAME2_R, 1, [have gethostbyname2_r]))
    AC_CHECK_LIB(c, ptrace, AC_DEFINE(HAVE_PTRACE, 1, [have ptrace]))
    AC_CHECK_LIB(c, getrandom, AC_DEFINE(HAVE_GETRANDOM, 1, [have getrandom]))
    AC_CHECK_LIB(c, arc4random, AC_DEFINE(HAVE_ARC4RANDOM, 1, [have arc4random]))
    AC_CHECK_LIB(c, CCRandomGenerateBytes, AC_DEFINE(HAVE_CCRANDOMGENERATEBYTES, 1, [have_ccrandomgeneratebytes]))
    AC_CHECK_LIB(pthread, pthread_rwlock_init, AC_DEFINE(HAVE_RWLOCK, 1, [have pthread_rwlock_init]))
    AC_CHECK_LIB(pthread, pthread_spin_lock, AC_DEFINE(HAVE_SPINLOCK, 1, [have pthread_spin_lock]))
    AC_CHECK_LIB(pthread, pthread_mutex_timedlock, AC_DEFINE(HAVE_MUTEX_TIMEDLOCK, 1, [have pthread_mutex_timedlock]))
    AC_CHECK_LIB(pthread, pthread_rwlock_timedrdlock, AC_DEFINE(HAVE_RWLOCK_TIMEDRDLOCK, 1, [have pthread_rwlock_timedrdlock]))
    AC_CHECK_LIB(pthread, pthread_rwlock_timedwrlock, AC_DEFINE(HAVE_RWLOCK_TIMEDWRLOCK, 1, [have pthread_rwlock_timedwrlock]))
    AC_CHECK_LIB(pthread, pthread_barrier_init, AC_DEFINE(HAVE_PTHREAD_BARRIER, 1, [have pthread_barrier_init]))
    AC_CHECK_LIB(pthread, pthread_mutexattr_setpshared, AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_SETPSHARED, 1, [have pthread_mutexattr_setpshared]))
    AC_CHECK_LIB(pthread, pthread_mutexattr_setrobust, AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_SETROBUST, 1, [have pthread_mutexattr_setrobust]))
    AC_CHECK_LIB(pthread, pthread_mutex_consistent, AC_DEFINE(HAVE_PTHREAD_MUTEX_CONSISTENT, 1, [have pthread_mutex_consistent]))

    if test "$PHP_SWOOLE_DEV" = "yes"; then
        AX_CHECK_COMPILE_FLAG(-Wbool-conversion,                _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wbool-conversion")
        AX_CHECK_COMPILE_FLAG(-Wignored-qualifiers,             _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wignored-qualifiers")
        AX_CHECK_COMPILE_FLAG(-Wduplicate-enum,                 _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wduplicate-enum")
        AX_CHECK_COMPILE_FLAG(-Wempty-body,                     _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wempty-body")
        AX_CHECK_COMPILE_FLAG(-Wenum-compare,                   _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wenum-compare")
        AX_CHECK_COMPILE_FLAG(-Wextra,                          _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wextra")
        AX_CHECK_COMPILE_FLAG(-Wformat-security,                _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wformat-security")
        AX_CHECK_COMPILE_FLAG(-Wheader-guard,                   _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wheader-guard")
        AX_CHECK_COMPILE_FLAG(-Wincompatible-pointer-types-discards-qualifiers, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wincompatible-pointer-types-discards-qualifiers")
        AX_CHECK_COMPILE_FLAG(-Winit-self,                      _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Winit-self")
        AX_CHECK_COMPILE_FLAG(-Wlogical-not-parentheses,        _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-not-parentheses")
        AX_CHECK_COMPILE_FLAG(-Wlogical-op-parentheses,         _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-op-parentheses")
        AX_CHECK_COMPILE_FLAG(-Wloop-analysis,                  _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wloop-analysis")
        AX_CHECK_COMPILE_FLAG(-Wuninitialized,                  _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wuninitialized")
        AX_CHECK_COMPILE_FLAG(-Wno-date-time,                   _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-date-time")
        AX_CHECK_COMPILE_FLAG(-Wno-missing-field-initializers,  _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-missing-field-initializers")
        AX_CHECK_COMPILE_FLAG(-Wno-sign-compare,                _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-sign-compare")
        AX_CHECK_COMPILE_FLAG(-Wno-unused-const-variable,       _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-unused-const-variable")
        AX_CHECK_COMPILE_FLAG(-Wno-unused-parameter,            _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-unused-parameter")
        AX_CHECK_COMPILE_FLAG(-Wno-variadic-macros,             _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-variadic-macros")
        AX_CHECK_COMPILE_FLAG(-Wparentheses,                    _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wparentheses")
        AX_CHECK_COMPILE_FLAG(-Wpointer-bool-conversion,        _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wpointer-bool-conversion")
        AX_CHECK_COMPILE_FLAG(-Wsizeof-array-argument,          _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wsizeof-array-argument")
        AX_CHECK_COMPILE_FLAG(-Wwrite-strings,                  _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wwrite-strings")
        AX_CHECK_COMPILE_FLAG(-fdiagnostics-show-option,        _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fdiagnostics-show-option")
        AX_CHECK_COMPILE_FLAG(-fno-omit-frame-pointer,          _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-omit-frame-pointer")
        AX_CHECK_COMPILE_FLAG(-fno-optimize-sibling-calls,      _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-optimize-sibling-calls")
        AX_CHECK_COMPILE_FLAG(-fsanitize-address,               _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fsanitize-address")
        AX_CHECK_COMPILE_FLAG(-fstack-protector,                _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fstack-protector")

        EXTRA_CFLAGS="$_MAINTAINER_CFLAGS"
        CFLAGS="-g -O0 -Wall $CFLAGS"
        CXXFLAGS="-g -O0 -Wall $CXXFLAGS"
    fi

    if test "$PHP_SWOOLE_CURL" = "yes"; then
        PKG_CHECK_MODULES([CURL], [libcurl >= 7.56.0])
        PHP_EVAL_LIBLINE($CURL_LIBS, SWOOLE_SHARED_LIBADD)
        PHP_EVAL_INCLINE($CURL_CFLAGS)
        AC_DEFINE(SW_USE_CURL, 1, [do we enable cURL native client])
    fi

    if test "$PHP_SWOOLE_CORO_TIME" = "yes"; then
        AC_DEFINE(SW_CORO_TIME, 1, [do we enable to calculate coroutine execution time])
    fi

    dnl pgsql begin

    if test "$PHP_SWOOLE_PGSQL" != "no"; then
        dnl TODO macros below can be reused to find curl things
        dnl prepare pkg-config

        if test -z "$PKG_CONFIG"; then
            AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
        fi
        AC_MSG_CHECKING(for libpq)
        if test "x${LIBPQ_LIBS+set}" = "xset" || test "x${LIBPQ_CFLAGS+set}" = "xset"; then
            AC_MSG_RESULT([using LIBPQ_CFLAGS and LIBPQ_LIBS])
        elif test -x "$PKG_CONFIG" ; then
            dnl find pkg using pkg-config cli tool
            libpq_pkg_config_path="$PHP_SWOOLE_PGSQL/lib/pkgconfig"
            if test "xyes" = "x$PHP_SWOOLE_PGSQL" ; then
                libpq_pkg_config_path=/lib/pkgconfig
            fi
            if test "x" != "x$PKG_CONFIG_PATH"; then
                libpq_pkg_config_path="$libpq_pkg_config_path:$PKG_CONFIG_PATH"
            fi

            libpq_version_full=`env PKG_CONFIG_PATH=${libpq_pkg_config_path} $PKG_CONFIG --modversion libpq`
            AC_MSG_RESULT(${libpq_version_full})
            LIBPQ_CFLAGS="`env PKG_CONFIG_PATH=${libpq_pkg_config_path} $PKG_CONFIG --cflags libpq`"
            LIBPQ_LIBS="`env PKG_CONFIG_PATH=${libpq_pkg_config_path} $PKG_CONFIG --libs libpq`"
        fi

        _libpq_saved_cflags="$CFLAGS"
        CFLAGS="$CFLAGS $LIBPQ_CFLAGS"
        AC_CHECK_HEADER(libpq-fe.h, [], [
            dnl this is too long, wht so chaos?
            cat >&2 <<EOF
libpq headers was not found.
set LIBPQ_CFLAGS and LIBPQ_LIBS environment or
install following package to obtain them:
    libpq-dev (for debian and its varients)
    postgresql-devel (for rhel varients)
    libpq-devel (for newer fedora)
    postgresql-libs (for arch and its varients)
    postgresql-dev (for alpine)
    postgresql (for homebrew)
EOF
            AC_MSG_ERROR([postgresql support needs libpq headers to build])
        ])
        CFLAGS="$_libpq_saved_cflags"

        _libpq_saved_libs=$LIBS
        LIBS="$LIBS $LIBPQ_LIBS"
        AC_CHECK_LIB(pq, PQlibVersion, [ ], [
            cat >&2 <<EOF
libpq libraries was not found.
set LIBPQ_CFLAGS and LIBPQ_LIBS environment or
install following package to obtain them:
    libpq-dev (for debian and its varients)
    postgresql-devel (for rhel varients)
    libpq-devel (for newer fedora)
    postgresql-libs (for arch and its varients)
    postgresql-dev (for alpine)
    postgresql (for homebrew)
EOF
            AC_MSG_ERROR([postgresql support needs libpq libraries to build])
        ])
        LIBS="$_libpq_saved_libs"

        dnl FIXME: this should be SWOOLE_CFLAGS="$SWOOLE_CFLAGS $LIBPQ_CFLAGS"
        dnl or SWOOLE_PGSQL_CFLAGS="$SWOOLE_CFLAGS $LIBPQ_CFLAGS" and SWOOLE_PGSQL_CFLAGS only applies to ext-src/swoole_postgresql_coro.cc
        EXTRA_CFLAGS="$EXTRA_CFLAGS $LIBPQ_CFLAGS"
        PHP_EVAL_LIBLINE($LIBPQ_LIBS, SWOOLE_SHARED_LIBADD)

        AC_DEFINE(SW_USE_PGSQL, 1, [do we enable postgresql coro support])
    fi

    dnl pgsql end

    dnl odbc begin

    if test "$PHP_SWOOLE_ODBC" != "no"; then
      PHP_CHECK_PDO_INCLUDES

      AC_MSG_CHECKING([for selected PDO ODBC flavour])

      pdo_odbc_flavour="`echo $PHP_SWOOLE_ODBC | cut -d, -f1`"
      pdo_odbc_dir="`echo $PHP_SWOOLE_ODBC | cut -d, -f2`"

      if test "$pdo_odbc_dir" = "$PHP_SWOOLE_ODBC" ; then
        pdo_odbc_dir=
      fi

      case $pdo_odbc_flavour in
        ibm-db2)
            pdo_odbc_def_libdir=/home/db2inst1/sqllib/lib
            pdo_odbc_def_incdir=/home/db2inst1/sqllib/include
            pdo_odbc_def_lib=db2
            ;;

        iODBC|iodbc)
            pdo_odbc_def_libdir=/usr/local/$PHP_LIBDIR
            pdo_odbc_def_incdir=/usr/local/include
            pdo_odbc_def_lib=iodbc
            ;;

        unixODBC|unixodbc)
            pdo_odbc_def_libdir=/usr/local/$PHP_LIBDIR
            pdo_odbc_def_incdir=/usr/local/include
            pdo_odbc_def_lib=odbc
            ;;

        ODBCRouter|odbcrouter)
            pdo_odbc_def_libdir=/usr/$PHP_LIBDIR
            pdo_odbc_def_incdir=/usr/include
            pdo_odbc_def_lib=odbcsdk
            ;;

        generic)
            pdo_odbc_def_lib="`echo $PHP_SWOOLE_ODBC | cut -d, -f3`"
            pdo_odbc_def_ldflags="`echo $PHP_SWOOLE_ODBC | cut -d, -f4`"
            pdo_odbc_def_cflags="`echo $PHP_SWOOLE_ODBC | cut -d, -f5`"
            pdo_odbc_flavour="generic-$pdo_odbc_def_lib"
            ;;

          *)
            AC_MSG_ERROR([Unknown ODBC flavour $pdo_odbc_flavour]PDO_ODBC_HELP_TEXT)
            ;;
      esac

      if test -n "$pdo_odbc_dir"; then
        PDO_ODBC_INCDIR="$pdo_odbc_dir/include"
        PDO_ODBC_LIBDIR="$pdo_odbc_dir/$PHP_LIBDIR"
      else
        PDO_ODBC_INCDIR="$pdo_odbc_def_incdir"
        PDO_ODBC_LIBDIR="$pdo_odbc_def_libdir"
      fi

      AC_MSG_RESULT([$pdo_odbc_flavour
              libs       $PDO_ODBC_LIBDIR,
              headers    $PDO_ODBC_INCDIR])

      if test ! -d "$PDO_ODBC_LIBDIR" ; then
        AC_MSG_WARN([library dir $PDO_ODBC_LIBDIR does not exist])
      fi

      PDO_ODBC_CHECK_HEADER(odbc.h)
      PDO_ODBC_CHECK_HEADER(odbcsdk.h)
      PDO_ODBC_CHECK_HEADER(iodbc.h)
      PDO_ODBC_CHECK_HEADER(sqlunix.h)
      PDO_ODBC_CHECK_HEADER(sqltypes.h)
      PDO_ODBC_CHECK_HEADER(sqlucode.h)
      PDO_ODBC_CHECK_HEADER(sql.h)
      PDO_ODBC_CHECK_HEADER(isql.h)
      PDO_ODBC_CHECK_HEADER(sqlext.h)
      PDO_ODBC_CHECK_HEADER(isqlext.h)
      PDO_ODBC_CHECK_HEADER(udbcext.h)
      PDO_ODBC_CHECK_HEADER(sqlcli1.h)
      PDO_ODBC_CHECK_HEADER(LibraryManager.h)
      PDO_ODBC_CHECK_HEADER(cli0core.h)
      PDO_ODBC_CHECK_HEADER(cli0ext.h)
      PDO_ODBC_CHECK_HEADER(cli0cli.h)
      PDO_ODBC_CHECK_HEADER(cli0defs.h)
      PDO_ODBC_CHECK_HEADER(cli0env.h)

      if test "$php_pdo_have_header" != "yes"; then
        AC_MSG_ERROR([Cannot find header file(s) for pdo_odbc])
      fi

      if test -n "$SWOOLE_ODBC_LIBS"; then
        ODBC_LIBS="$SWOOLE_ODBC_LIBS"
      else
        ODBC_LIBS="-l$pdo_odbc_def_lib"
      fi

      PDO_ODBC_INCLUDE="$pdo_odbc_def_cflags -I$PDO_ODBC_INCDIR -DPDO_ODBC_TYPE=\\\"$pdo_odbc_flavour\\\""
      PDO_ODBC_LDFLAGS="$pdo_odbc_def_ldflags -L$PDO_ODBC_LIBDIR $ODBC_LIBS"

      PHP_EVAL_LIBLINE([$PDO_ODBC_LDFLAGS], [SWOOLE_SHARED_LIBADD])

      EXTRA_CFLAGS="$EXTRA_CFLAGS -I$pdo_cv_inc_path $PDO_ODBC_INCLUDE"

      dnl Check first for an ODBC 1.0 function to assert that the libraries work
      SAVE_LIBS="$LIBS"
      LIBS="$LIBS $PDO_ODBC_LDFLAGS"

      AC_LINK_IFELSE(
        [AC_LANG_PROGRAM(
           [[#include <sql.h>
             #include <sqlext.h>]],
           [[
             SQLLEN ind = 0;
             char buf[1];
             SQLBindCol((SQLHSTMT)0, (SQLUSMALLINT)1, (SQLSMALLINT)SQL_C_CHAR,
                        (SQLPOINTER)buf, (SQLLEN)sizeof(buf), &ind);
             return 0;
           ]])],
        [
          dnl And now check for an ODBC 3.0 function to assert that they are *good*
          dnl libraries.
          AC_LINK_IFELSE(
            [AC_LANG_PROGRAM(
               [[#include <sql.h>
                 #include <sqlext.h>]],
               [[
                 SQLHANDLE out = SQL_NULL_HANDLE;
                 SQLAllocHandle((SQLSMALLINT)SQL_HANDLE_ENV,
                                (SQLHANDLE)SQL_NULL_HANDLE, &out);
                 return 0;
               ]])],
            [],
            [AC_MSG_ERROR([
    Your ODBC library does not appear to be ODBC 3 compatible.
    You should consider using iODBC or unixODBC instead, and loading your
    libraries as a driver in that environment; it will emulate the
    functions required for PDO support.
    ])]
          )
        ],
        [AC_MSG_ERROR([Your ODBC library does not exist or there was an error. Check config.log for more information])]
    )

      LIBS="$SAVE_LIBS"

      AC_DEFINE(SW_USE_ODBC, 1, [do we enable swoole-odbc coro support])
    fi

    dnl odbc end

    dnl SWOOLE_ORACLE start

    if test -z "$SED"; then
        SWOOLE_PDO_OCI_SED="sed";
    else
        SWOOLE_PDO_OCI_SED="$SED";
    fi

    SWOOLE_PDO_OCI_TAIL1=`echo a | tail -n1 2>/dev/null`
    if test "$SWOOLE_PDO_OCI_TAIL1" = "a"; then
        SWOOLE_PDO_OCI_TAIL1="tail -n1"
    else
        SWOOLE_PDO_OCI_TAIL1="tail -1"
    fi

    AC_DEFUN([AC_PDO_OCI_VERSION],[
        AC_MSG_CHECKING([Oracle version])
        PDO_OCI_LCS_BASE=$PDO_OCI_LIB_DIR/libclntsh.$SHLIB_SUFFIX_NAME
        dnl Oracle 10g, 11g, 12c etc
        PDO_OCI_LCS=`ls $PDO_OCI_LCS_BASE.*.1 2> /dev/null | $SWOOLE_PDO_OCI_TAIL1`
        if test -f "$PDO_OCI_LCS"; then
            dnl Oracle 10g, 11g 12c etc. The x.2 version libraries are named x.1 for
            dnl drop in compatibility
            PDO_OCI_VERSION=`echo $PDO_OCI_LCS | $SWOOLE_PDO_OCI_SED -e 's/.*\.\(.*\)\.1$/\1.1/'`
        elif test -f $PDO_OCI_LCS_BASE.9.0; then
            dnl There is no case for Oracle 9.2. Oracle 9.2 libraries have a 9.0 suffix
            dnl for drop-in compatibility with Oracle 9.0
            PDO_OCI_VERSION=9.0
        else
            AC_MSG_ERROR(Oracle libclntsh.$SHLIB_SUFFIX_NAME client library not found or its version is lower than 9)
        fi
        AC_MSG_RESULT($PDO_OCI_VERSION)
    ])

    AC_DEFUN([AC_PDO_OCI_CHECK_LIB_DIR],[
        AC_CHECK_SIZEOF([long])
        AC_MSG_CHECKING([if we're at 64-bit platform])
        AS_IF([test "$ac_cv_sizeof_long" -eq 4],[
            AC_MSG_RESULT([no])
            TMP_PDO_OCI_LIB_DIR="$PDO_OCI_DIR/lib32"
        ],[
            AC_MSG_RESULT([yes])
            TMP_PDO_OCI_LIB_DIR="$PDO_OCI_DIR/lib"
        ])

        AC_MSG_CHECKING([OCI8 libraries dir])
        if test -d "$PDO_OCI_DIR/lib" && test ! -d "$PDO_OCI_DIR/lib32"; then
            PDO_OCI_LIB_DIR="$PDO_OCI_DIR/lib"
        elif test ! -d "$PDO_OCI_DIR/lib" && test -d "$PDO_OCI_DIR/lib32"; then
            PDO_OCI_LIB_DIR="$PDO_OCI_DIR/lib32"
        elif test -d "$PDO_OCI_DIR/lib" && test -d "$PDO_OCI_DIR/lib32"; then
            PDO_OCI_LIB_DIR=$TMP_PDO_OCI_LIB_DIR
        else
            AC_MSG_ERROR([Oracle required OCI8 libraries not found])
        fi
        AC_MSG_RESULT($PDO_OCI_LIB_DIR)
    ])

    PHP_ARG_WITH([swoole-oracle],
        [whether to enable oracle build flags],
        [AS_HELP_STRING([[--with-swoole-oracle[=DIR]]],
            ["PDO: Oracle OCI support. DIR defaults to ${ORACLE_HOME}. Use
            --with-swoole-oracle=instantclient,/path/to/instant/client/lib for an Oracle
            Instant Client installation."])], [no], [no])

    if test "$PHP_SWOOLE_ORACLE" != "no"; then
        if test "$PHP_PDO" = "no" && test "$ext_shared" = "no"; then
            AC_MSG_ERROR([PDO is not enabled! Add --enable-pdo to your configure line.])
        fi

        AC_MSG_CHECKING([Oracle Install-Dir])
        if test "$PHP_SWOOLE_ORACLE" = "yes" || test -z "$PHP_SWOOLE_ORACLE"; then
            PDO_OCI_DIR=$ORACLE_HOME
        else
            PDO_OCI_DIR=$PHP_SWOOLE_ORACLE
        fi
        AC_MSG_RESULT($PHP_SWOOLE_ORACLE)

        AC_MSG_CHECKING([if that is sane])
        if test -z "$PDO_OCI_DIR"; then
            AC_MSG_ERROR([You need to tell me where to find your Oracle Instant Client SDK, or set ORACLE_HOME.])
        else
            AC_MSG_RESULT([yes])
        fi

        if test "instantclient" = "`echo $PDO_OCI_DIR | cut -d, -f1`" ; then
            AC_CHECK_SIZEOF([long])
            AC_MSG_CHECKING([if we're at 64-bit platform])
            AS_IF([test "$ac_cv_sizeof_long" -eq 4],[
                AC_MSG_RESULT([no])
                PDO_OCI_CLIENT_DIR="client"
            ],[
                AC_MSG_RESULT([yes])
                PDO_OCI_CLIENT_DIR="client64"
            ])

            PDO_OCI_LIB_DIR="`echo $PDO_OCI_DIR | cut -d, -f2`"
            AC_PDO_OCI_VERSION($PDO_OCI_LIB_DIR)

            AC_MSG_CHECKING([for oci.h])
            dnl Header directory for Instant Client SDK RPM install
            OCISDKRPMINC=`echo "$PDO_OCI_LIB_DIR" | $SWOOLE_PDO_OCI_SED -e 's!^\(.*\)/lib/oracle/\(.*\)/\('${PDO_OCI_CLIENT_DIR}'\)/lib[/]*$!\1/include/oracle/\2/\3!'`

            dnl Header directory for manual installation
            OCISDKMANINC=`echo "$PDO_OCI_LIB_DIR" | $SWOOLE_PDO_OCI_SED -e 's!^\(.*\)/lib[/]*$!\1/include!'`

            dnl Header directory for Instant Client SDK zip file install
            OCISDKZIPINC=$PDO_OCI_LIB_DIR/sdk/include

            if test -f "$OCISDKRPMINC/oci.h" ; then
                PHP_ADD_INCLUDE($OCISDKRPMINC)
                AC_MSG_RESULT($OCISDKRPMINC)
            elif test -f "$OCISDKMANINC/oci.h" ; then
                PHP_ADD_INCLUDE($OCISDKMANINC)
                AC_MSG_RESULT($OCISDKMANINC)
            elif test -f "$OCISDKZIPINC/oci.h" ; then
                PHP_ADD_INCLUDE($OCISDKZIPINC)
                AC_MSG_RESULT($OCISDKZIPINC)
            else
                AC_MSG_ERROR([I'm too dumb to figure out where the include dir is in your Instant Client install])
            fi
        else
            AC_PDO_OCI_CHECK_LIB_DIR($PDO_OCI_DIR)

            if test -d "$PDO_OCI_DIR/rdbms/public"; then
                PHP_ADD_INCLUDE($PDO_OCI_DIR/rdbms/public)
                PDO_OCI_INCLUDES="$PDO_OCI_INCLUDES -I$PDO_OCI_DIR/rdbms/public"
            fi
            if test -d "$PDO_OCI_DIR/rdbms/demo"; then
                PHP_ADD_INCLUDE($PDO_OCI_DIR/rdbms/demo)
                PDO_OCI_INCLUDES="$PDO_OCI_INCLUDES -I$PDO_OCI_DIR/rdbms/demo"
            fi
            if test -d "$PDO_OCI_DIR/network/public"; then
                PHP_ADD_INCLUDE($PDO_OCI_DIR/network/public)
                PDO_OCI_INCLUDES="$PDO_OCI_INCLUDES -I$PDO_OCI_DIR/network/public"
            fi
            if test -d "$PDO_OCI_DIR/plsql/public"; then
                PHP_ADD_INCLUDE($PDO_OCI_DIR/plsql/public)
                PDO_OCI_INCLUDES="$PDO_OCI_INCLUDES -I$PDO_OCI_DIR/plsql/public"
            fi
            if test -d "$PDO_OCI_DIR/include"; then
                PHP_ADD_INCLUDE($PDO_OCI_DIR/include)
                PDO_OCI_INCLUDES="$PDO_OCI_INCLUDES -I$PDO_OCI_DIR/include"
            fi

            if test -f "$PDO_OCI_LIB_DIR/sysliblist"; then
                PHP_EVAL_LIBLINE(`cat $PDO_OCI_LIB_DIR/sysliblist`, SWOOLE_SHARED_LIBADD)
            elif test -f "$PDO_OCI_DIR/rdbms/lib/sysliblist"; then
                PHP_EVAL_LIBLINE(`cat $PDO_OCI_DIR/rdbms/lib/sysliblist`, SWOOLE_SHARED_LIBADD)
            fi
            AC_PDO_OCI_VERSION($PDO_OCI_LIB_DIR)
        fi

        case $PDO_OCI_VERSION in
            7.3|8.0|8.1)
                AC_MSG_ERROR([Oracle client libraries < 9 are not supported])
                ;;
        esac

        PHP_ADD_LIBRARY(clntsh, 1, SWOOLE_SHARED_LIBADD)
        PHP_ADD_LIBPATH($PDO_OCI_LIB_DIR, SWOOLE_SHARED_LIBADD)

        PHP_CHECK_LIBRARY(clntsh, OCIEnvCreate,
        [
            AC_DEFINE(HAVE_OCIENVCREATE,1,[ ])
        ], [], [
            -L$PDO_OCI_LIB_DIR $SWOOLE_SHARED_LIBADD
        ])

        PHP_CHECK_LIBRARY(clntsh, OCIEnvNlsCreate,
        [
            AC_DEFINE(HAVE_OCIENVNLSCREATE,1,[ ])
        ], [], [
            -L$PDO_OCI_LIB_DIR $SWOOLE_SHARED_LIBADD
        ])

        dnl Scrollable cursors?
        PHP_CHECK_LIBRARY(clntsh, OCIStmtFetch2,
        [
            AC_DEFINE(HAVE_OCISTMTFETCH2,1,[ ])
        ], [], [
            -L$PDO_OCI_LIB_DIR $SWOOLE_SHARED_LIBADD
        ])

        dnl Can handle bytes vs. characters?
        PHP_CHECK_LIBRARY(clntsh, OCILobRead2,
        [
           AC_DEFINE(HAVE_OCILOBREAD2,1,[ ])
        ], [], [
           -L$PDO_OCI_LIB_DIR $SWOOLE_SHARED_LIBADD
        ])

        EXTRA_CFLAGS="$EXTRA_CFLAGS -I$pdo_cv_inc_path $PDO_OCI_INCLUDE"
        PHP_CHECK_PDO_INCLUDES
        AC_DEFINE_UNQUOTED(SWOOLE_PDO_OCI_CLIENT_VERSION, "$PDO_OCI_VERSION", [ ])
        AC_DEFINE(SW_USE_ORACLE, 1, [do we enable oracle coro support])
    fi
    dnl SWOOLE_ORACLE stop

    dnl sqlite start
    PHP_ARG_ENABLE([swoole-sqlite],
        ["for sqlite 3 support for PDO"],
        [AS_HELP_STRING([--enable-swoole-sqlite],
            [PDO: sqlite 3 support.])], [no], [no])

    if test "$PHP_SWOOLE_SQLITE" != "no"; then

        if test "$PHP_PDO" = "no" && test "$ext_shared" = "no"; then
            AC_MSG_ERROR([PDO is not enabled! Add --enable-pdo to your configure line.])
        fi

        PHP_CHECK_PDO_INCLUDES

        PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.7.7])

        PHP_EVAL_INCLINE($SQLITE_CFLAGS)
        PHP_EVAL_LIBLINE($SQLITE_LIBS, SWOOLE_SHARED_LIBADD)
        AC_DEFINE(HAVE_SW_PDO_SQLITELIB, 1, [Define to 1 if you have the pdo_sqlite extension enabled.])

        PHP_CHECK_LIBRARY(sqlite3, sqlite3_close_v2, [
            AC_DEFINE(HAVE_SW_SQLITE3_CLOSE_V2, 1, [have sqlite3_close_v2])
        ], [], [$SWOOLE_SHARED_LIBADD])

        PHP_CHECK_LIBRARY(sqlite3, sqlite3_column_table_name, [
            AC_DEFINE(HAVE_SW_SQLITE3_COLUMN_TABLE_NAME, 1, [have sqlite3_column_table_name])
        ], [], [$SWOOLE_SHARED_LIBADD])

        AC_DEFINE(SW_USE_SQLITE, 1, [do we enable sqlite coro support])
    fi
    dnl sqlite stop

    dnl firebird start

    if test "$PHP_SWOOLE_FIREBIRD" != "no"; then
        if test "$PHP_PDO" = "no" && test "$ext_shared" = "no"; then
            AC_MSG_ERROR([PDO is not enabled! Add --enable-pdo to your configure line.])
        fi

      AC_PATH_PROG([FB_CONFIG], [fb_config], [no])

      if test -x "$FB_CONFIG" && test "$PHP_PDO_FIREBIRD" = "yes"; then
        AC_MSG_CHECKING([for libfbconfig])
        FB_CFLAGS=$($FB_CONFIG --cflags)
        FB_LIBDIR=$($FB_CONFIG --libs)
        FB_VERSION=$($FB_CONFIG --version)
        AC_MSG_RESULT([version $FB_VERSION])
        AS_VERSION_COMPARE([$FB_VERSION], [3.0],
          [AC_MSG_ERROR([Firebird required version is at least 3.0])])
        PHP_EVAL_LIBLINE([$FB_LIBDIR], [SWOOLE_SHARED_LIBADD])
        PHP_EVAL_INCLINE([$FB_CFLAGS])
      else
        AS_VAR_IF([PHP_PDO_FIREBIRD], [yes], [
          FIREBIRD_INCDIR=
          FIREBIRD_LIBDIR=
          FIREBIRD_LIBDIR_FLAG=
        ], [
          FIREBIRD_INCDIR=$PHP_PDO_FIREBIRD/include
          FIREBIRD_LIBDIR=$PHP_PDO_FIREBIRD/$PHP_LIBDIR
          FIREBIRD_LIBDIR_FLAG=-L$FIREBIRD_LIBDIR
        ])

        PHP_CHECK_LIBRARY([fbclient], [fb_get_master_interface],
          [],
          [AC_MSG_FAILURE([libfbclient not found.])],
          [$FIREBIRD_LIBDIR_FLAG])
        PHP_ADD_LIBRARY_WITH_PATH([fbclient],
          [$FIREBIRD_LIBDIR],
          [SWOOLE_SHARED_LIBADD])
        PHP_ADD_INCLUDE([$FIREBIRD_INCDIR])
      fi

      PHP_CHECK_PDO_INCLUDES
      AC_DEFINE(SW_USE_FIREBIRD, 1, [do we enable firebird coro support])
    fi

    dnl firebird stop


    dnl ssh2 start

    if test "$PHP_SWOOLE_SSH2" != "no"; then
        SEARCH_PATH="/usr/local /usr"
        SEARCH_FOR="/include/libssh2.h"
        if test -r $PHP_SWOOLE_SSH2/$SEARCH_FOR; then # path given as parameter
            SSH2_DIR=$PHP_SWOOLE_SSH2
        else
            AC_MSG_CHECKING([for ssh2 files in default path])
            for i in $SEARCH_PATH ; do
                if test -r $i/$SEARCH_FOR; then
                    SSH2_DIR=$i
                    AC_MSG_RESULT(found in $i)
                fi
            done
        fi

        if test -z "$SSH2_DIR"; then
            AC_MSG_RESULT([not found])
            AC_MSG_ERROR([The required libssh2 library was not found.
                You can obtain that package from http://sourceforge.net/projects/libssh2/])
        fi

        PHP_ADD_INCLUDE($SSH2_DIR/include)

        PHP_CHECK_LIBRARY(ssh2, libssh2_session_hostkey, [
            PHP_ADD_LIBRARY_WITH_PATH(ssh2, $SSH2_DIR/lib, SWOOLE_SHARED_LIBADD)
            AC_DEFINE(SW_HAVE_SSH2LIB, 1, [Have libssh2])
        ],[
            AC_MSG_ERROR([libssh2 version >= 1.2 not found])
        ],[
            -L$SSH2_DIR/lib -lm
        ])

        PHP_CHECK_LIBRARY(ssh2, libssh2_agent_init, [
            AC_DEFINE(PHP_SSH2_AGENT_AUTH, 1, [Have libssh2 with ssh-agent support])
        ],[
            AC_MSG_WARN([libssh2 <= 1.2.3, ssh-agent subsystem support not enabled])
        ],[
            -L$SSH2_DIR/lib -lm
        ])

        PHP_CHECK_LIBRARY(ssh2, libssh2_session_set_timeout, [
            AC_DEFINE(PHP_SSH2_SESSION_TIMEOUT, 1, [Have libssh2 with session timeout support])
        ],[
            AC_MSG_WARN([libssh2 < 1.2.9, session timeout support not enabled])
        ],[
            -L$SSH2_DIR/lib -lm
        ])
    fi

    dnl ssh2 stop

    AC_CHECK_LIB(z, gzgets, [
        AC_DEFINE(SW_HAVE_ZLIB, 1, [have zlib])
        PHP_ADD_LIBRARY(z, 1, SWOOLE_SHARED_LIBADD)
    ])

    if test "$PHP_BROTLI_DIR" != "no"; then
        AC_DEFINE(SW_HAVE_BROTLI, 1, [have brotli])
        PHP_ADD_INCLUDE("${PHP_BROTLI_DIR}/include")
        PHP_ADD_LIBRARY_WITH_PATH(brotlienc, "${PHP_BROTLI_DIR}/${PHP_LIBDIR}")
        PHP_ADD_LIBRARY_WITH_PATH(brotlidec, "${PHP_BROTLI_DIR}/${PHP_LIBDIR}")
    elif test "$PHP_BROTLI" = "yes"; then
        PKG_CHECK_MODULES([BROTLIENC], [libbrotlienc])
        PKG_CHECK_MODULES([BROTLIDEC], [libbrotlidec])
        AC_DEFINE(SW_HAVE_BROTLI, 1, [have brotli])
        PHP_EVAL_LIBLINE($BROTLIENC_LIBS, SWOOLE_SHARED_LIBADD)
        PHP_EVAL_INCLINE($BROTLIENC_CFLAGS)
        PHP_EVAL_LIBLINE($BROTLIDEC_LIBS, SWOOLE_SHARED_LIBADD)
        PHP_EVAL_INCLINE($BROTLIDEC_CFLAGS)
    elif test "$PHP_BROTLI" = "auto"; then
        PKG_CHECK_MODULES([BROTLIENC], [libbrotlienc], [found_brotlienc=yes], [found_brotlienc=no])
        if test "$found_brotlienc" = "yes"; then
            AC_DEFINE(SW_HAVE_BROTLI, 1, [have brotli])
            PHP_EVAL_LIBLINE($BROTLIENC_LIBS, SWOOLE_SHARED_LIBADD)
            PHP_EVAL_INCLINE($BROTLIENC_CFLAGS)
        fi

        PKG_CHECK_MODULES([BROTLIDEC], [libbrotlidec], [found_brotlidec=yes], [found_brotlidec=no])
        if test "$found_brotlidec" = "yes"; then
            AC_DEFINE(SW_HAVE_BROTLI, 1, [have brotli])
            PHP_EVAL_LIBLINE($BROTLIDEC_LIBS, SWOOLE_SHARED_LIBADD)
            PHP_EVAL_INCLINE($BROTLIDEC_CFLAGS)
        fi
    fi

    if test "$PHP_ZSTD" = "yes"; then
        PKG_CHECK_MODULES([ZSTD], [libzstd >= 1.4.0])
        AC_DEFINE(SW_HAVE_ZSTD, 1, [have zstd])
        PHP_EVAL_LIBLINE($ZSTD_LIBS, SWOOLE_SHARED_LIBADD)
        PHP_EVAL_INCLINE($ZSTD_CFLAGS)
    fi

    PHP_ADD_LIBRARY(pthread)
    PHP_SUBST(SWOOLE_SHARED_LIBADD)

    AC_ARG_ENABLE(debug,
        [  --enable-debug          Compile with debug symbols],
        [PHP_DEBUG=$enableval],
        [PHP_DEBUG=0]
    )

    if test "$PHP_DEBUG_LOG" != "no"; then
        AC_DEFINE(SW_DEBUG, 1, [do we enable swoole debug])
        PHP_DEBUG=1
    fi

    if test "$PHP_ASAN" != "no"; then
        PHP_DEBUG=1
        CFLAGS="$CFLAGS -fsanitize=address -fno-omit-frame-pointer"
        CXXFLAGS="$CXXFLAGS -fsanitize=address -fno-omit-frame-pointer"
    fi

    if test "$PHP_TRACE_LOG" != "no"; then
        AC_DEFINE(SW_LOG_TRACE_OPEN, 1, [enable trace log])
    fi

    if test "$PHP_SWOOLE_THREAD" != "no"; then
        AC_DEFINE(SW_THREAD, 1, [enable swoole thread support])
    fi

    if test "$PHP_SWOOLE_STDEXT" != "no"; then
        AC_DEFINE(SW_STDEXT, 1, [enable swoole stdext support])
    fi

    if test "$PHP_SOCKETS" = "yes"; then
        AC_MSG_CHECKING([for php_sockets.h])

        AS_IF([test -f $abs_srcdir/ext/sockets/php_sockets.h], [AC_MSG_RESULT([ok, found in $abs_srcdir])],
            [test -f $phpincludedir/ext/sockets/php_sockets.h], [AC_MSG_RESULT([ok, found in $phpincludedir])],
            [AC_MSG_ERROR([cannot find php_sockets.h. Please check if sockets extension is installed.])
        ])

        AC_DEFINE(SW_SOCKETS, 1, [enable sockets support])

        dnl Some systems build and package PHP socket extension separately
        dnl and php_config.h does not have HAVE_SOCKETS defined.
        AC_DEFINE(HAVE_SOCKETS, 1, [whether sockets extension is enabled])

        PHP_ADD_EXTENSION_DEP(swoole, sockets, true)
    fi

    if test "$PHP_THREAD" = "yes"; then
        AC_DEFINE(SW_USE_THREAD, 1, [enable thread support])
    fi

    if test "$PHP_CARES" = "yes"; then
        PKG_CHECK_MODULES([CARES], [libcares])
        PHP_EVAL_LIBLINE($CARES_LIBS, SWOOLE_SHARED_LIBADD)
        PHP_EVAL_INCLINE($CARES_CFLAGS)
        AC_DEFINE(SW_USE_CARES, 1, [do we enable c-ares support])
        AC_DEFINE(HAVE_CARES, 1, [have c-ares])
    fi

    AC_SWOOLE_CPU_AFFINITY
    AC_SWOOLE_HAVE_REUSEPORT
    AC_SWOOLE_HAVE_FUTEX
    AC_SWOOLE_HAVE_UCONTEXT
    AC_SWOOLE_HAVE_VALGRIND
    AC_SWOOLE_CHECK_SOCKETS
    AC_SWOOLE_HAVE_MSGQUEUE
    AC_SWOOLE_HAVE_BOOST_STACKTRACE

    AS_CASE([$host_os],
      [darwin*], [SW_OS="MAC"],
      [cygwin*], [SW_OS="CYGWIN"],
      [mingw*], [SW_OS="MINGW"],
      [linux*], [SW_OS="LINUX"],
      [*bsd*], [SW_OS="BSD"],
      []
    )

    CFLAGS="-Wall -pthread $CFLAGS"
    LDFLAGS="$LDFLAGS -lpthread"

	HAVE_CONFIG_IOURING_X="no"
    if (test "$PHP_IOURING" = "yes" || test "$PHP_LIBURING_DIR" != "no") && test "$SW_OS" = "LINUX"; then
        if test "$PHP_IOURING" != "no"; then
            PKG_CHECK_MODULES([URING], [liburing >= 2.8])
			PHP_EVAL_LIBLINE($URING_LIBS, SWOOLE_SHARED_LIBADD)
            PHP_EVAL_INCLINE($URING_CFLAGS)
        elif test "$PHP_LIBURING_DIR" != "no"; then
            PHP_ADD_INCLUDE("${PHP_LIBURING_DIR}/include")
            PHP_ADD_LIBRARY_WITH_PATH(uring, "${PHP_LIBURING_DIR}/${PHP_LIBDIR}")
            PHP_ADD_LIBRARY(uring, 1, SWOOLE_SHARED_LIBADD)
        fi

        AC_SWOOLE_HAVE_IOURING_STATX

        KERNEL_MAJOR=`uname -r | awk -F '.' '{print $1}'`
        KERNEL_MINOR=`uname -r | awk -F '.' '{print $2}'`

        if (test $KERNEL_MAJOR -eq 6 && test $KERNEL_MINOR -ge 9); then
            dnl IORING_OP_FTRUNCATE is available since 6.9
            AC_SWOOLE_HAVE_IOURING_FTRUNCATE
        fi

        if (test $KERNEL_MAJOR -eq 6 && test $KERNEL_MINOR -ge 7); then
            dnl IORING_OP_FUTEX_WAKE/IORING_OP_FUTEX_WAIT is available since 6.7
            AC_SWOOLE_HAVE_IOURING_FUTEX
        fi

        HAVE_CONFIG_IOURING_X="yes"
        AC_DEFINE(SW_USE_IOURING, 1, [have io_uring])
    fi

    if test "$PHP_URING_SOCKET" != "no"; then
        if test "$HAVE_CONFIG_IOURING_X" != "no"; then
            AC_DEFINE(SW_USE_URING_SOCKET, 1, [enable io_uring socket support])
        else
            AC_MSG_ERROR([--enable-uring-socket requires io_uring. Please specify either --enable-iouring or --with-liburing-dir.])
        fi
    fi

    dnl Check should we link to librt

    if test "$SW_OS" = "LINUX"; then
        GLIBC_VERSION=$(getconf GNU_LIBC_VERSION | awk '{print $2}')
        AC_MSG_NOTICE([glibc version: $GLIBC_VERSION])

        GLIBC_MAJOR_VERSION=$(getconf GNU_LIBC_VERSION | awk '{print $2}' | cut -d '.' -f 1)
        GLIBC_MINOR_VERSION=$(getconf GNU_LIBC_VERSION | awk '{print $2}' | cut -d '.' -f 2)

        if test $GLIBC_MAJOR_VERSION -lt 2 || (test $GLIBC_MAJOR_VERSION -eq 2 && test $GLIBC_MINOR_VERSION -lt 17); then
            OS_SHOULD_HAVE_LIBRT=1
        else
            AC_MSG_NOTICE([link with -lrt (only for glibc version before 2.17)])
            OS_SHOULD_HAVE_LIBRT=0
        fi
    elif test "$SW_OS" = "MAC"; then
        OS_SHOULD_HAVE_LIBRT=0
    else
        AS_CASE([$host_os],
          [openbsd*], [OS_SHOULD_HAVE_LIBRT=0]
          [OS_SHOULD_HAVE_LIBRT=1]
        )
    fi

    if test "x$OS_SHOULD_HAVE_LIBRT" = "x1"; then
        AC_MSG_NOTICE([Librt is required on $host_os.])
        dnl Check for the existence of librt
        AC_CHECK_LIB([rt], [clock_gettime], [], [
            AC_MSG_ERROR([We have to link to librt on your os, but librt not found.])
        ])
        PHP_ADD_LIBRARY(rt, 1, SWOOLE_SHARED_LIBADD)
    else
        AC_MSG_NOTICE([$host_os doesn't have librt -- don't link to librt.])
    fi

    if test "$SW_OS" = "LINUX"; then
        LDFLAGS="$LDFLAGS -z now"
    fi

    if test "$PHP_OPENSSL_DIR" != "no"; then
        PHP_ADD_INCLUDE("${PHP_OPENSSL_DIR}/include")
        PHP_ADD_LIBRARY_WITH_PATH(ssl, "${PHP_OPENSSL_DIR}/${PHP_LIBDIR}")
        PHP_ADD_LIBRARY_WITH_PATH(crypto, "${PHP_OPENSSL_DIR}/${PHP_LIBDIR}")
    else
        PKG_CHECK_MODULES([SSL], [libssl])
        PHP_EVAL_LIBLINE($SSL_LIBS, SWOOLE_SHARED_LIBADD)
        PHP_EVAL_INCLINE($SSL_CFLAGS)
        
        PKG_CHECK_MODULES([CRYPTO], [libcrypto])
        PHP_EVAL_LIBLINE($CRYPTO_LIBS, SWOOLE_SHARED_LIBADD)
        PHP_EVAL_INCLINE($CRYPTO_CFLAGS)
    fi
    
    if test "$PHP_NGHTTP2_DIR" != "no"; then
        PHP_ADD_INCLUDE("${PHP_NGHTTP2_DIR}/include")
        PHP_ADD_LIBRARY_WITH_PATH(nghttp2, "${PHP_NGHTTP2_DIR}/${PHP_LIBDIR}")
        PHP_ADD_LIBRARY(nghttp2, 1, SWOOLE_SHARED_LIBADD)
    fi

    PHP_ADD_LIBRARY(pthread, 1, SWOOLE_SHARED_LIBADD)

    if test "$PHP_MYSQLND" = "yes"; then
        PHP_ADD_EXTENSION_DEP(mysqli, mysqlnd)
        AC_DEFINE(SW_USE_MYSQLND, 1, [use mysqlnd])
    fi

    AC_MSG_CHECKING([for sources])
    if test -f "$abs_srcdir/ext-src/php_swoole.cc"; then
        swoole_source_dir=$abs_srcdir
    elif test -f "ext-src/php_swoole.cc"; then
        swoole_source_dir=$(pwd)
    else
        swoole_source_dir="ext/swoole"
    fi
    AC_MSG_RESULT([$swoole_source_dir])

    ext_src_files=$(cd $swoole_source_dir && find ext-src/ -name *.cc)
    lib_src_files=$(cd $swoole_source_dir && find src/ -name *.cc)

    swoole_source_file="${ext_src_files} ${lib_src_files}"

    swoole_source_file="$swoole_source_file \
        thirdparty/php/sockets/multicast.cc \
        thirdparty/php/sockets/sendrecvmsg.cc \
        thirdparty/php/sockets/conversions.cc \
        thirdparty/php/sockets/sockaddr_conv.cc \
        thirdparty/php/standard/var_decoder.cc \
        thirdparty/php/standard/proc_open.cc"

    swoole_source_file="$swoole_source_file \
        thirdparty/llhttp/api.c \
        thirdparty/llhttp/http.c \
        thirdparty/llhttp/llhttp.c \
        thirdparty/multipart_parser.c"

    if test "$PHP_NGHTTP2_DIR" = "no"; then
        swoole_source_file="$swoole_source_file \
            thirdparty/nghttp2/nghttp2_hd.c \
            thirdparty/nghttp2/nghttp2_rcbuf.c \
            thirdparty/nghttp2/nghttp2_helper.c \
            thirdparty/nghttp2/nghttp2_buf.c \
            thirdparty/nghttp2/nghttp2_mem.c \
            thirdparty/nghttp2/nghttp2_hd_huffman.c \
            thirdparty/nghttp2/nghttp2_hd_huffman_data.c"
    fi

    dnl During static compilation, there is no php-config variable,
    dnl but the php-version variable is always present and is not affected by the shell environment variables.
    dnl During dynamic compilation, the php-config variable is always available, whereas the php-version variable is absent.

    if test -z "$PHP_CONFIG"; then
        if test -z "$PHP_VERSION"; then
            AC_MSG_ERROR([the PHP_VERSION variable must be defined])
        else
            SW_PHP_VERSION=$PHP_VERSION
        fi
    else
        SW_PHP_VERSION=`$PHP_CONFIG --version`
    fi

    SW_PHP_VERSION_ID=`echo "${SW_PHP_VERSION}" | $AWK 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 10 + [$]2); }'`
    SW_PHP_THIRDPARTY_DIR="thirdparty/php${SW_PHP_VERSION_ID}"

    AC_MSG_NOTICE([php version: $SW_PHP_VERSION, version_id: $SW_PHP_VERSION_ID, thirdparty_dir: $SW_PHP_THIRDPARTY_DIR])

    if test "$PHP_SWOOLE_CURL" != "no"; then
        if test "$SW_PHP_VERSION_ID" -ge "84"; then
            swoole_source_file="$swoole_source_file \
                thirdparty/php84/curl/interface.cc \
                thirdparty/php84/curl/multi.cc"
        else
            swoole_source_file="$swoole_source_file \
                thirdparty/php/curl/interface.cc \
                thirdparty/php/curl/multi.cc"
        fi
    fi

    if test "$PHP_SWOOLE_PGSQL" != "no"; then
        swoole_source_file="$swoole_source_file \
            ${SW_PHP_THIRDPARTY_DIR}/pdo_pgsql/pgsql_driver.c \
            ${SW_PHP_THIRDPARTY_DIR}/pdo_pgsql/pgsql_statement.c"
        if test "$SW_PHP_VERSION_ID" -ge "84"; then
            swoole_source_file="$swoole_source_file \
                ${SW_PHP_THIRDPARTY_DIR}/pdo_pgsql/pgsql_sql_parser.c"
        fi
    fi

    if test "$PHP_SWOOLE_ORACLE" != "no"; then
        swoole_source_file="$swoole_source_file \
            thirdparty/pdo_oci/oci_driver.c \
            thirdparty/pdo_oci/oci_statement.c"
    fi

    if test "$PHP_SWOOLE_ODBC" != "no"; then
        swoole_source_file="$swoole_source_file \
            ${SW_PHP_THIRDPARTY_DIR}/pdo_odbc/odbc_driver.c \
            ${SW_PHP_THIRDPARTY_DIR}/pdo_odbc/odbc_stmt.c"
    fi

    if test "$PHP_SWOOLE_SQLITE" != "no"; then
        swoole_source_file="$swoole_source_file \
            thirdparty/pdo_sqlite/sqlite_driver.c \
            thirdparty/pdo_sqlite/sqlite_statement.c"
        if test "$SW_PHP_VERSION_ID" -ge "84"; then
            swoole_source_file="$swoole_source_file \
                thirdparty/pdo_sqlite/sqlite_sql_parser.c"
        fi
    fi

    if test "$PHP_SWOOLE_FIREBIRD" != "no"; then
        if test "$SW_PHP_VERSION_ID" -ge "85"; then
            swoole_source_file="$swoole_source_file \
                thirdparty/php85/pdo_firebird/firebird_driver.c \
                thirdparty/php85/pdo_firebird/firebird_statement.c \
                thirdparty/php85/pdo_firebird/pdo_firebird_utils.cpp"
        else
            swoole_source_file="$swoole_source_file \
                thirdparty/php84/pdo_firebird/firebird_driver.c \
                thirdparty/php84/pdo_firebird/firebird_statement.c \
                thirdparty/php84/pdo_firebird/pdo_firebird_utils.cpp"
        fi
    fi

    if test "$PHP_SWOOLE_SSH2" != "no"; then
        swoole_source_file="$swoole_source_file \
            thirdparty/php/ssh2/ssh2.cc \
            thirdparty/php/ssh2/ssh2_fopen_wrappers.cc \
            thirdparty/php/ssh2/ssh2_sftp.cc"
    fi

    if test "$PHP_SWOOLE_FTP" != "no"; then
        AC_DEFINE(SW_HAVE_FTP_SSL, 1, [have swoole-ftp with SSL])
        swoole_source_file="$swoole_source_file \
            thirdparty/php84/ftp/ftp.c \
            thirdparty/php84/ftp/php_ftp.c"
        AC_DEFINE(SW_HAVE_FTP, 1, [have swoole-ftp])
    fi

    SW_ASM_DIR="thirdparty/boost/asm/"
    SW_USE_ASM_CONTEXT="yes"

    AS_CASE([$host_cpu],
      [x86_64*], [SW_CPU="x86_64"],
      [amd64*], [SW_CPU="x86_64"],
      [x86*], [SW_CPU="x86"],
      [i?86*], [SW_CPU="x86"],
      [arm64*], [SW_CPU="arm64"],
      [aarch64*], [SW_CPU="arm64"],
      [arm*], [SW_CPU="arm32"],
      [mips64*], [SW_CPU="mips64"],
      [mips*], [SW_CPU="mips32"],
      [riscv64*], [SW_CPU="riscv64"],
      [loongarch64*], [SW_CPU="loongarch64"],
      [
        SW_USE_ASM_CONTEXT="no"
      ]
    )

    if test "$SW_OS" = "MAC"; then
        SW_CONTEXT_ASM_FILE="combined_sysv_macho_gas.S"
    elif test "$SW_CPU" = "x86_64"; then
        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
            SW_CONTEXT_ASM_FILE="x86_64_sysv_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    elif test "$SW_CPU" = "x86"; then
        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
            SW_CONTEXT_ASM_FILE="i386_sysv_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    elif test "$SW_CPU" = "arm32"; then
        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
            SW_CONTEXT_ASM_FILE="arm_aapcs_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    elif test "$SW_CPU" = "arm64"; then
        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
            SW_CONTEXT_ASM_FILE="arm64_aapcs_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
     elif test "$SW_CPU" = "ppc32"; then
        if test "$SW_OS" = "LINUX"; then
            SW_CONTEXT_ASM_FILE="ppc32_sysv_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    elif test "$SW_CPU" = "ppc64"; then
        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
            SW_CONTEXT_ASM_FILE="ppc64_sysv_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    elif test "$SW_CPU" = "mips64"; then
        if test "$SW_OS" = "LINUX"; then
           SW_CONTEXT_ASM_FILE="mips64_n64_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    elif test "$SW_CPU" = "mips32"; then
        if test "$SW_OS" = "LINUX"; then
           SW_CONTEXT_ASM_FILE="mips32_o32_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    elif test "$SW_CPU" = "riscv64"; then
        if test "$SW_OS" = "LINUX"; then
           SW_CONTEXT_ASM_FILE="riscv64_sysv_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    elif test "$SW_CPU" = "loongarch64"; then
        if test "$SW_OS" = "LINUX"; then
           SW_CONTEXT_ASM_FILE="loongarch64_sysv_elf_gas.S"
        else
            SW_USE_ASM_CONTEXT="no"
        fi
    else
        SW_USE_ASM_CONTEXT="no"
    fi

    if test "$PHP_THREAD_CONTEXT" != "no"; then
        AC_DEFINE(SW_USE_THREAD_CONTEXT, 1, [do we enable thread context])
        SW_USE_ASM_CONTEXT="no"
    fi

    if test "$SW_USE_ASM_CONTEXT" = "yes"; then
        swoole_source_file="$swoole_source_file \
            ${SW_ASM_DIR}make_${SW_CONTEXT_ASM_FILE} \
            ${SW_ASM_DIR}jump_${SW_CONTEXT_ASM_FILE} "
        AC_DEFINE(SW_USE_ASM_CONTEXT, 1, [use boost asm context])
    fi

    EXTRA_CFLAGS="$EXTRA_CFLAGS -DENABLE_PHP_SWOOLE"

    PHP_NEW_EXTENSION(swoole, $swoole_source_file, $ext_shared,, "$EXTRA_CFLAGS", cxx)

    PHP_ADD_INCLUDE([$ext_srcdir])
    PHP_ADD_INCLUDE([$ext_srcdir/include])
    PHP_ADD_INCLUDE([$ext_srcdir/ext-src])
    PHP_ADD_INCLUDE([$ext_srcdir/thirdparty])

    AC_MSG_CHECKING([swoole coverage])
    if test "$PHP_SWOOLE_COVERAGE" != "no"; then
        AC_MSG_RESULT([enabled])

        PHP_ADD_MAKEFILE_FRAGMENT
    else
        AC_MSG_RESULT([disabled])
    fi

    PHP_INSTALL_HEADERS([ext/swoole], [ext-src/*.h config.h php_swoole.h \
        include/*.h \
        stubs/*.h \
        thirdparty/*.h \
        thirdparty/llhttp/*.h \
        thirdparty/nghttp2/*.h])

    PHP_REQUIRE_CXX()

    CXXFLAGS="$CXXFLAGS -Wall -Wno-date-time -Wno-unused-function -Wno-deprecated -Wno-deprecated-declarations"

    if test "$SW_OS" = "CYGWIN" || test "$SW_OS" = "MINGW"; then
        CXXFLAGS="$CXXFLAGS -std=gnu++14"
    else
        CXXFLAGS="$CXXFLAGS -std=c++14"
    fi

    if test "$SW_CPU" = "arm"; then
        PHP_ADD_LIBRARY(atomic, 1, SWOOLE_SHARED_LIBADD)
    fi

    PHP_ADD_BUILD_DIR($ext_builddir/ext-src)
    PHP_ADD_BUILD_DIR($ext_builddir/src/core)
    PHP_ADD_BUILD_DIR($ext_builddir/src/memory)
    PHP_ADD_BUILD_DIR($ext_builddir/src/reactor)
    PHP_ADD_BUILD_DIR($ext_builddir/src/lock)
    PHP_ADD_BUILD_DIR($ext_builddir/src/os)
    PHP_ADD_BUILD_DIR($ext_builddir/src/network)
    PHP_ADD_BUILD_DIR($ext_builddir/src/server)
    PHP_ADD_BUILD_DIR($ext_builddir/src/protocol)
    PHP_ADD_BUILD_DIR($ext_builddir/src/coroutine)
    PHP_ADD_BUILD_DIR($ext_builddir/src/wrapper)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/boost)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/boost/asm)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php/sockets)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php/standard)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php/curl)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php/ssh2)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/pdo_oci)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/pdo_sqlite)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php84/curl)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php84/pdo_firebird)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php85/pdo_firebird)
    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/llhttp)

    if test "$PHP_NGHTTP2_DIR" = "no"; then
        PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/nghttp2)
    fi
    if test "$PHP_SWOOLE_PGSQL" != "no"; then
        PHP_ADD_BUILD_DIR($ext_builddir/${SW_PHP_THIRDPARTY_DIR}/pdo_pgsql)
    fi
    if test "$PHP_SWOOLE_ODBC" != "no"; then
        PHP_ADD_BUILD_DIR($ext_builddir/${SW_PHP_THIRDPARTY_DIR}/pdo_odbc)
    fi
    if test "$PHP_SWOOLE_FTP" != "no"; then
        PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php84/ftp)
    fi
fi


================================================
FILE: core-tests/.gitignore
================================================
.idea/
.cmake/
Testing/
build.ninja
.ninja_deps
.ninja_log

================================================
FILE: core-tests/code-stats.sh
================================================
#!/bin/sh -e
__CURRENT__=$(pwd)
__DIR__=$(cd "$(dirname "$0")";pwd)

# enter the dir
cd "${__DIR__}"
cloc . --exclude-dir=js,Debug,CMakeFiles,build,CMakeFiles,deps


================================================
FILE: core-tests/docker-compose.yml
================================================
version: '3.4'
services:
  httpbin:
    container_name: "httpbin"
    image: "kennethreitz/httpbin"
  tinyproxy:
    container_name: "tinyproxy"
    image: "vimagick/tinyproxy"
    ports:
      - 8888:8888
  socks5:
    container_name: "socks5"
    image: "xkuma/socks5"
    ports:
      - "8080:1080"
    environment:
      - PROXY_USER=user
      - PROXY_PASSWORD=password
      - PROXY_SERVER=0.0.0.0:1080
  socks5-no-auth:
    image: "xkuma/socks5"
    ports:
      - 8081:1080
    environment:
      PROXY_SERVER: 0.0.0.0:1080


================================================
FILE: core-tests/fuzz/project.json
================================================
{
    "project": {
        "name": "fuzz",
        "type": "bin"
    },
    "build": {
        "ldflags": "",
        "cxxflags": "",
        "cflags": "",
        "c_std": "",
        "cxx_std": ""
    },
    "install": {
        "target": ""
    }
}

================================================
FILE: core-tests/fuzz/src/main.cpp
================================================
#include "phpx_embed.h"
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

using namespace php;
using namespace std;

int main(int argc, char * argv[])
{
    VM vm(argc, argv);
    cout << "hello world" << endl;

    char buf[8192];
    ssize_t n;

    int fd = 0;
    if (argc > 0) {
        fd = open(argv[1], O_RDONLY);
    }

    n = read(fd, buf, 8192);
    if (n < 0) {
        fprintf(stderr, "failed to read data\n");
        return 1;
    }

    auto req_var = exec("Swoole\\Http\\Request::create");

    var_dump(req_var);

    if (!req_var.isObject()) {
        fprintf(stderr, "cannot create object of Swoole\\Http\\Request\n");
        return 2;
    }

    Variant data(buf, n);

    auto req = Object(req_var);
    auto retval = req.exec("parse", data);

    printf("retval=%ld", retval.toInt());

    var_dump(req);

    return 0;
}


================================================
FILE: core-tests/include/httplib_client.h
================================================
/**
 * httplib.h
 *
 * Copyright (c) 2020 Yuji Hirose. All rights reserved.
 * MIT License
 * GitHub: https://github.com/yhirose/cpp-httplib
 */

#pragma once

#include "swoole_websocket.h"

/*
 * Configuration
 */

#ifndef CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND
#define CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND 5
#endif

#ifndef CPPHTTPLIB_KEEPALIVE_TIMEOUT_USECOND
#define CPPHTTPLIB_KEEPALIVE_TIMEOUT_USECOND 0
#endif

#ifndef CPPHTTPLIB_KEEPALIVE_MAX_COUNT
#define CPPHTTPLIB_KEEPALIVE_MAX_COUNT 5
#endif

#ifndef CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND
#define CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND 300
#endif

#ifndef CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND
#define CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND 0
#endif

#ifndef CPPHTTPLIB_READ_TIMEOUT_SECOND
#define CPPHTTPLIB_READ_TIMEOUT_SECOND 5
#endif

#ifndef CPPHTTPLIB_READ_TIMEOUT_USECOND
#define CPPHTTPLIB_READ_TIMEOUT_USECOND 0
#endif

#ifndef CPPHTTPLIB_WRITE_TIMEOUT_SECOND
#define CPPHTTPLIB_WRITE_TIMEOUT_SECOND 5
#endif

#ifndef CPPHTTPLIB_WRITE_TIMEOUT_USECOND
#define CPPHTTPLIB_WRITE_TIMEOUT_USECOND 0
#endif

#ifndef CPPHTTPLIB_IDLE_INTERVAL_SECOND
#define CPPHTTPLIB_IDLE_INTERVAL_SECOND 0
#endif

#ifndef CPPHTTPLIB_IDLE_INTERVAL_USECOND
#ifdef _WIN32
#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 10000
#else
#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 0
#endif
#endif

#ifndef CPPHTTPLIB_REQUEST_URI_MAX_LENGTH
#define CPPHTTPLIB_REQUEST_URI_MAX_LENGTH 8192
#endif

#ifndef CPPHTTPLIB_REDIRECT_MAX_COUNT
#define CPPHTTPLIB_REDIRECT_MAX_COUNT 20
#endif

#ifndef CPPHTTPLIB_PAYLOAD_MAX_LENGTH
#define CPPHTTPLIB_PAYLOAD_MAX_LENGTH ((std::numeric_limits<size_t>::max)())
#endif

#ifndef CPPHTTPLIB_TCP_NODELAY
#define CPPHTTPLIB_TCP_NODELAY true
#endif

#ifndef CPPHTTPLIB_RECV_BUFSIZ
#define CPPHTTPLIB_RECV_BUFSIZ size_t(4096u)
#endif

#ifndef CPPHTTPLIB_THREAD_POOL_COUNT
#define CPPHTTPLIB_THREAD_POOL_COUNT                                                                                   \
    ((std::max)(8u, std::thread::hardware_concurrency() > 0 ? std::thread::hardware_concurrency() - 1 : 0))
#endif

// Prefer gnu::deprecated, otherwise gcc complains if we use
// [[deprecated]] together with pedantic.
#ifndef CPPHTTPLIB_DEPRECATED
#if defined(__has_cpp_attribute)
#if __has_cpp_attribute(gnu::deprecated)
#define CPPHTTPLIB_DEPRECATED [[gnu::deprecated]]
#else
#if __has_cpp_attribute(deprecated)
#define CPPHTTPLIB_DEPRECATED [[deprecated]]
#else
#define CPPHTTPLIB_DEPRECATED
#endif
#endif
#else
#define CPPHTTPLIB_DEPRECATED
#endif
#endif

/*
 * Headers
 */

#ifdef _WIN32
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif  //_CRT_SECURE_NO_WARNINGS

#ifndef _CRT_NONSTDC_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#endif  //_CRT_NONSTDC_NO_DEPRECATE

#if defined(_MSC_VER)
#ifdef _WIN64
using ssize_t = __int64;
#else
using ssize_t = int;
#endif

#if _MSC_VER < 1900
#define snprintf _snprintf_s
#endif
#endif  // _MSC_VER

#ifndef S_ISREG
#define S_ISREG(m) (((m) &S_IFREG) == S_IFREG)
#endif  // S_ISREG

#ifndef S_ISDIR
#define S_ISDIR(m) (((m) &S_IFDIR) == S_IFDIR)
#endif  // S_ISDIR

#ifndef NOMINMAX
#define NOMINMAX
#endif  // NOMINMAX

#include <io.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#ifndef WSA_FLAG_NO_HANDLE_INHERIT
#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
#endif

#ifdef _MSC_VER
#pragma comment(lib, "ws2_32.lib")
#endif

#ifndef strcasecmp
#define strcasecmp _stricmp
#endif  // strcasecmp

using socket_t = SOCKET;
#ifdef CPPHTTPLIB_USE_POLL
#define poll(fds, nfds, timeout) WSAPoll(fds, nfds, timeout)
#endif

#else  // not _WIN32

#include <arpa/inet.h>
#include <cstring>
#include <ifaddrs.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#ifdef CPPHTTPLIB_USE_POLL
#include <poll.h>
#endif
#include <csignal>
#include <pthread.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <unistd.h>

using socket_t = int;
#define INVALID_SOCKET (-1)
#endif  //_WIN32

#include <array>
#include <atomic>
#include <cassert>
#include <climits>
#include <condition_variable>
#include <errno.h>
#include <fcntl.h>
#include <fstream>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <mutex>
#include <random>
#include <regex>
#include <string>
#include <sys/stat.h>
#include <thread>

#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
#include <openssl/err.h>
#include <openssl/md5.h>
#include <openssl/ssl.h>
#include <openssl/x509v3.h>

#include <iomanip>
#include <iostream>
#include <sstream>

// #if OPENSSL_VERSION_NUMBER < 0x1010100fL
// #error Sorry, OpenSSL versions prior to 1.1.1 are not supported
// #endif

#if OPENSSL_VERSION_NUMBER < 0x10100000L
#include <openssl/crypto.h>
inline const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *asn1) {
    return M_ASN1_STRING_data(asn1);
}
#endif
#endif

#ifdef CPPHTTPLIB_ZLIB_SUPPORT
#include <zlib.h>
#endif
/*
 * Declaration
 */
namespace httplib {

const std::string USER_AGENT = "cpp-httplib/0.7";

namespace detail {

struct ci {
    bool operator()(const std::string &s1, const std::string &s2) const {
        return std::lexicographical_compare(
            s1.begin(), s1.end(), s2.begin(), s2.end(), [](char c1, char c2) { return ::tolower(c1) < ::tolower(c2); });
    }
};

}  // namespace detail

using Headers = std::multimap<std::string, std::string, detail::ci>;

using Params = std::multimap<std::string, std::string>;
using Match = std::smatch;

using Progress = std::function<bool(uint64_t current, uint64_t total)>;

struct Response;
struct WebSocketFrame;

using ResponseHandler = std::function<bool(const Response &response)>;

struct MultipartFormData {
    std::string name;
    std::string content;
    std::string filename;
    std::string content_type;
};
using MultipartFormDataItems = std::vector<MultipartFormData>;
using MultipartFormDataMap = std::multimap<std::string, MultipartFormData>;

class DataSink {
  public:
    DataSink() : os(&sb_), sb_(*this) {}

    DataSink(const DataSink &) = delete;
    DataSink &operator=(const DataSink &) = delete;
    DataSink(DataSink &&) = delete;
    DataSink &operator=(DataSink &&) = delete;

    std::function<void(const char *data, size_t data_len)> write;
    std::function<void()> done;
    std::function<bool()> is_writable;
    std::ostream os;

  private:
    class data_sink_streambuf : public std::streambuf {
      public:
        data_sink_streambuf(DataSink &sink) : sink_(sink) {}

      protected:
        std::streamsize xsputn(const char *s, std::streamsize n) {
            sink_.write(s, static_cast<size_t>(n));
            return n;
        }

      private:
        DataSink &sink_;
    };

    data_sink_streambuf sb_;
};

using ContentProvider = std::function<bool(size_t offset, size_t length, DataSink &sink)>;

using ChunkedContentProvider = std::function<bool(size_t offset, DataSink &sink)>;

using ContentReceiver = std::function<bool(const char *data, size_t data_length)>;

using MultipartContentHeader = std::function<bool(const MultipartFormData &file)>;

using Range = std::pair<ssize_t, ssize_t>;
using Ranges = std::vector<Range>;

struct Request {
    std::string method;
    std::string path;
    Headers headers;
    std::string body;

    std::string remote_addr;
    int remote_port = -1;

    // for server
    std::string version;
    std::string target;
    Params params;
    MultipartFormDataMap files;
    Ranges ranges;
    Match matches;

    // for client
    size_t redirect_count = CPPHTTPLIB_REDIRECT_MAX_COUNT;
    ResponseHandler response_handler;
    ContentReceiver content_receiver;
    size_t content_length = 0;
    ContentProvider content_provider;
    Progress progress;

#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    const SSL *ssl;
#endif

    bool has_header(const char *key) const;
    std::string get_header_value(const char *key, size_t id = 0) const;
    size_t get_header_value_count(const char *key) const;
    void set_header(const char *key, const char *val);
    void set_header(const char *key, const std::string &val);

    bool has_param(const char *key) const;
    std::string get_param_value(const char *key, size_t id = 0) const;
    size_t get_param_value_count(const char *key) const;

    bool is_multipart_form_data() const;

    bool has_file(const char *key) const;
    MultipartFormData get_file_value(const char *key) const;

    // private members...
    size_t authorization_count_ = 0;
};

struct Response {
    std::string version;
    int status = -1;
    Headers headers;
    std::string body;

    bool has_header(const char *key) const;
    std::string get_header_value(const char *key, size_t id = 0) const;
    size_t get_header_value_count(const char *key) const;
    void set_header(const char *key, const char *val);
    void set_header(const char *key, const std::string &val);

    void set_redirect(const char *url, int status = 302);
    void set_content(const char *s, size_t n, const char *content_type);
    void set_content(std::string s, const char *content_type);

    void set_content_provider(
        size_t length, ContentProvider provider, std::function<void()> resource_releaser = [] {});

    void set_chunked_content_provider(
        ChunkedContentProvider provider, std::function<void()> resource_releaser = [] {});

    Response() = default;
    Response(const Response &) = default;
    Response &operator=(const Response &) = default;
    Response(Response &&) = default;
    Response &operator=(Response &&) = default;
    ~Response() {
        if (content_provider_resource_releaser_) {
            content_provider_resource_releaser_();
        }
    }

    // private members...
    size_t content_length_ = 0;
    ContentProvider content_provider_;
    std::function<void()> content_provider_resource_releaser_;
};

struct WebSocketFrame : public swoole::websocket::Frame {
    WebSocketFrame() = default;
    ~WebSocketFrame() {
        if (payload) {
            sw_free(payload - header_length);
        }
    }
};

class Stream {
  public:
    virtual ~Stream() = default;

    virtual bool is_readable() const = 0;
    virtual bool is_writable() const = 0;

    virtual ssize_t read(char *ptr, size_t size) = 0;
    virtual ssize_t write(const char *ptr, size_t size) = 0;
    virtual void get_remote_ip_and_port(std::string &ip, int &port) const = 0;

    template <typename... Args>
    ssize_t write_format(const char *fmt, const Args &...args);
    ssize_t write(const char *ptr);
    ssize_t write(const std::string &s);
};

using Logger = std::function<void(const Request &, const Response &)>;

using SocketOptions = std::function<void(socket_t sock)>;

inline void default_socket_options(socket_t sock) {
    int yes = 1;
#ifdef _WIN32
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char *>(&yes), sizeof(yes));
    setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, reinterpret_cast<char *>(&yes), sizeof(yes));
#else
#ifdef SO_REUSEPORT
    setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast<void *>(&yes), sizeof(yes));
#else
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<void *>(&yes), sizeof(yes));
#endif
#endif
}

class Client {
  public:
    explicit Client(const std::string &host);

    explicit Client(const std::string &host, int port);

    explicit Client(const std::string &host,
                    int port,
                    const std::string &client_cert_path,
                    const std::string &client_key_path);

    virtual ~Client();

    virtual bool is_valid() const;

    std::shared_ptr<Response> Get(const char *path);

    std::shared_ptr<Response> Get(const char *path, const Headers &headers);

    std::shared_ptr<Response> Get(const char *path, Progress progress);

    std::shared_ptr<Response> Get(const char *path, const Headers &headers, Progress progress);

    std::shared_ptr<Response> Get(const char *path, ContentReceiver content_receiver);

    std::shared_ptr<Response> Get(const char *path, const Headers &headers, ContentReceiver content_receiver);

    std::shared_ptr<Response> Get(const char *path, ContentReceiver content_receiver, Progress progress);

    std::shared_ptr<Response> Get(const char *path,
                                  const Headers &headers,
                                  ContentReceiver content_receiver,
                                  Progress progress);

    std::shared_ptr<Response> Get(const char *path,
                                  const Headers &headers,
                                  ResponseHandler response_handler,
                                  ContentReceiver content_receiver);

    std::shared_ptr<Response> Get(const char *path,
                                  const Headers &headers,
                                  ResponseHandler response_handler,
                                  ContentReceiver content_receiver,
                                  Progress progress);

    bool Upgrade(const char *path, Headers &headers);

    std::shared_ptr<Response> Head(const char *path);

    std::shared_ptr<Response> Head(const char *path, const Headers &headers);

    std::shared_ptr<Response> Post(const char *path);

    std::shared_ptr<Response> Post(const char *path, const std::string &body, const char *content_type);

    std::shared_ptr<Response> Post(const char *path,
                                   const Headers &headers,
                                   const std::string &body,
                                   const char *content_type);

    std::shared_ptr<Response> Post(const char *path,
                                   size_t content_length,
                                   ContentProvider content_provider,
                                   const char *content_type);

    std::shared_ptr<Response> Post(const char *path,
                                   const Headers &headers,
                                   size_t content_length,
                                   ContentProvider content_provider,
                                   const char *content_type);

    std::shared_ptr<Response> Post(const char *path, const Params &params);

    std::shared_ptr<Response> Post(const char *path, const Headers &headers, const Params &params);

    std::shared_ptr<Response> Post(const char *path, const MultipartFormDataItems &items);

    std::shared_ptr<Response> Post(const char *path, const Headers &headers, const MultipartFormDataItems &items);

    std::shared_ptr<Response> Put(const char *path);

    std::shared_ptr<Response> Put(const char *path, const std::string &body, const char *content_type);

    std::shared_ptr<Response> Put(const char *path,
                                  const Headers &headers,
                                  const std::string &body,
                                  const char *content_type);

    std::shared_ptr<Response> Put(const char *path,
                                  size_t content_length,
                                  ContentProvider content_provider,
                                  const char *content_type);

    std::shared_ptr<Response> Put(const char *path,
                                  const Headers &headers,
                                  size_t content_length,
                                  ContentProvider content_provider,
                                  const char *content_type);

    std::shared_ptr<Response> Put(const char *path, const Params &params);

    std::shared_ptr<Response> Put(const char *path, const Headers &headers, const Params &params);

    // websocket
    inline bool Push(const std::string &data, int opcode = swoole::websocket::OPCODE_TEXT) {
        return Push(data.c_str(), data.length(), swoole::websocket::OPCODE_TEXT);
    }
    bool Push(const char *data, size_t length, int opcode = swoole::websocket::OPCODE_TEXT);
    std::shared_ptr<WebSocketFrame> Recv();

    std::shared_ptr<Response> Patch(const char *path, const std::string &body, const char *content_type);

    std::shared_ptr<Response> Patch(const char *path,
                                    const Headers &headers,
                                    const std::string &body,
                                    const char *content_type);

    std::shared_ptr<Response> Patch(const char *path,
                                    size_t content_length,
                                    ContentProvider content_provider,
                                    const char *content_type);

    std::shared_ptr<Response> Patch(const char *path,
                                    const Headers &headers,
                                    size_t content_length,
                                    ContentProvider content_provider,
                                    const char *content_type);

    std::shared_ptr<Response> Delete(const char *path);

    std::shared_ptr<Response> Delete(const char *path, const std::string &body, const char *content_type);

    std::shared_ptr<Response> Delete(const char *path, const Headers &headers);

    std::shared_ptr<Response> Delete(const char *path,
                                     const Headers &headers,
                                     const std::string &body,
                                     const char *content_type);

    std::shared_ptr<Response> Options(const char *path);

    std::shared_ptr<Response> Options(const char *path, const Headers &headers);

    bool send(const Request &req, Response &res);

    size_t is_socket_open() const;

    void stop();

    void set_tcp_nodelay(bool on);
    void set_socket_options(SocketOptions socket_options);

    CPPHTTPLIB_DEPRECATED void set_timeout_sec(time_t timeout_sec);
    void set_connection_timeout(time_t sec, time_t usec = 0);
    void set_read_timeout(time_t sec, time_t usec = 0);
    void set_write_timeout(time_t sec, time_t usec = 0);

    void set_basic_auth(const char *username, const char *password);
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    void set_digest_auth(const char *username, const char *password);
#endif

    void set_keep_alive(bool on);
    void set_follow_location(bool on);

    void set_compress(bool on);

    void set_decompress(bool on);

    void set_interface(const char *intf);

    void set_websocket_mask(bool on);

    void set_proxy(const char *host, int port);
    void set_proxy_basic_auth(const char *username, const char *password);
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    void set_proxy_digest_auth(const char *username, const char *password);
#endif

    void set_logger(Logger logger);

  protected:
    struct Socket {
        socket_t sock = INVALID_SOCKET;
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
        SSL *ssl = nullptr;
#endif

        bool is_open() const {
            return sock != INVALID_SOCKET;
        }
    };

    virtual bool create_and_connect_socket(Socket &socket);
    virtual void close_socket(Socket &socket, bool process_socket_ret);

    bool process_request(Stream &strm, const Request &req, Response &res, bool close_connection);

    // Socket endoint information
    const std::string host_;
    const int port_;
    const std::string host_and_port_;

    // Current open socket
    Socket socket_;
    mutable std::mutex socket_mutex_;
    std::recursive_mutex request_mutex_;

    // Settings
    std::string client_cert_path_;
    std::string client_key_path_;

    time_t connection_timeout_sec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND;
    time_t connection_timeout_usec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND;
    time_t read_timeout_sec_ = CPPHTTPLIB_READ_TIMEOUT_SECOND;
    time_t read_timeout_usec_ = CPPHTTPLIB_READ_TIMEOUT_USECOND;
    time_t write_timeout_sec_ = CPPHTTPLIB_WRITE_TIMEOUT_SECOND;
    time_t write_timeout_usec_ = CPPHTTPLIB_WRITE_TIMEOUT_USECOND;

    std::string basic_auth_username_;
    std::string basic_auth_password_;
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    std::string digest_auth_username_;
    std::string digest_auth_password_;
#endif

    bool keep_alive_ = false;
    bool follow_location_ = false;

    bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY;
    SocketOptions socket_options_ = nullptr;

    bool compress_ = false;
    bool decompress_ = true;

    std::string interface_;

    std::string proxy_host_;
    int proxy_port_ = 80;

    bool websocket_mask_ = false;

    std::string proxy_basic_auth_username_;
    std::string proxy_basic_auth_password_;
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    std::string proxy_digest_auth_username_;
    std::string proxy_digest_auth_password_;
#endif

    Logger logger_;

    void copy_settings(const Client &rhs) {
        client_cert_path_ = rhs.client_cert_path_;
        client_key_path_ = rhs.client_key_path_;
        connection_timeout_sec_ = rhs.connection_timeout_sec_;
        read_timeout_sec_ = rhs.read_timeout_sec_;
        read_timeout_usec_ = rhs.read_timeout_usec_;
        write_timeout_sec_ = rhs.write_timeout_sec_;
        write_timeout_usec_ = rhs.write_timeout_usec_;
        basic_auth_username_ = rhs.basic_auth_username_;
        basic_auth_password_ = rhs.basic_auth_password_;
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
        digest_auth_username_ = rhs.digest_auth_username_;
        digest_auth_password_ = rhs.digest_auth_password_;
#endif
        keep_alive_ = rhs.keep_alive_;
        follow_location_ = rhs.follow_location_;
        tcp_nodelay_ = rhs.tcp_nodelay_;
        socket_options_ = rhs.socket_options_;
        compress_ = rhs.compress_;
        decompress_ = rhs.decompress_;
        interface_ = rhs.interface_;
        proxy_host_ = rhs.proxy_host_;
        proxy_port_ = rhs.proxy_port_;
        proxy_basic_auth_username_ = rhs.proxy_basic_auth_username_;
        proxy_basic_auth_password_ = rhs.proxy_basic_auth_password_;
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
        proxy_digest_auth_username_ = rhs.proxy_digest_auth_username_;
        proxy_digest_auth_password_ = rhs.proxy_digest_auth_password_;
#endif
        websocket_mask_ = rhs.websocket_mask_;
        logger_ = rhs.logger_;
    }

  private:
    socket_t create_client_socket() const;
    bool read_response_line(Stream &strm, Response &res);
    bool write_request(Stream &strm, const Request &req, bool close_connection);
    bool redirect(const Request &req, Response &res);
    bool handle_request(Stream &strm, const Request &req, Response &res, bool close_connection);

    std::shared_ptr<Response> send_with_content_provider(const char *method,
                                                         const char *path,
                                                         const Headers &headers,
                                                         const std::string &body,
                                                         size_t content_length,
                                                         ContentProvider content_provider,
                                                         const char *content_type);

    virtual bool process_socket(Socket &socket, std::function<bool(Stream &strm)> callback);
    virtual bool is_ssl() const;
};

inline void Get(std::vector<Request> &requests, const char *path, const Headers &headers) {
    Request req;
    req.method = "GET";
    req.path = path;
    req.headers = headers;
    requests.emplace_back(std::move(req));
}

inline void Get(std::vector<Request> &requests, const char *path) {
    Get(requests, path, Headers());
}

inline void Post(std::vector<Request> &requests,
                 const char *path,
                 const Headers &headers,
                 const std::string &body,
                 const char *content_type) {
    Request req;
    req.method = "POST";
    req.path = path;
    req.headers = headers;
    if (content_type) {
        req.headers.emplace("Content-Type", content_type);
    }
    req.body = body;
    requests.emplace_back(std::move(req));
}

inline void Post(std::vector<Request> &requests, const char *path, const std::string &body, const char *content_type) {
    Post(requests, path, Headers(), body, content_type);
}

inline void Post(std::vector<Request> &requests,
                 const char *path,
                 size_t content_length,
                 ContentProvider content_provider,
                 const char *content_type) {
    Request req;
    req.method = "POST";
    req.headers = Headers();
    req.path = path;
    req.content_length = content_length;
    req.content_provider = content_provider;

    if (content_type) {
        req.headers.emplace("Content-Type", content_type);
    }

    requests.emplace_back(std::move(req));
}

class Client2 {
  public:
    explicit Client2(const char *scheme_host_port) : Client2(scheme_host_port, std::string(), std::string()) {}

    explicit Client2(const char *scheme_host_port,
                     const std::string &client_cert_path,
                     const std::string &client_key_path) {
        const static std::regex re(R"(^(https?)://([^:/?#]+)(?::(\d+))?)");

        std::cmatch m;
        if (std::regex_match(scheme_host_port, m, re)) {
            auto scheme = m[1].str();
            auto host = m[2].str();
            auto port_str = m[3].str();

            auto port = !port_str.empty() ? std::stoi(port_str) : (scheme == "https" ? 443 : 80);

            if (scheme == "https") {
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
                is_ssl_ = true;
                cli_ = std::make_shared<SSLClient>(host.c_str(), port, client_cert_path, client_key_path);
#endif
            } else {
                cli_ = std::make_shared<Client>(host.c_str(), port, client_cert_path, client_key_path);
            }
        }
    }

    ~Client2() {}

    bool is_valid() const {
        return cli_ != nullptr;
    }

    std::shared_ptr<Response> Get(const char *path) {
        return cli_->Get(path);
    }

    std::shared_ptr<Response> Get(const char *path, const Headers &headers) {
        return cli_->Get(path, headers);
    }

    std::shared_ptr<Response> Get(const char *path, Progress progress) {
        return cli_->Get(path, progress);
    }

    std::shared_ptr<Response> Get(const char *path, const Headers &headers, Progress progress) {
        return cli_->Get(path, headers, progress);
    }

    std::shared_ptr<Response> Get(const char *path, ContentReceiver content_receiver) {
        return cli_->Get(path, content_receiver);
    }

    std::shared_ptr<Response> Get(const char *path, const Headers &headers, ContentReceiver content_receiver) {
        return cli_->Get(path, headers, content_receiver);
    }

    std::shared_ptr<Response> Get(const char *path, ContentReceiver content_receiver, Progress progress) {
        return cli_->Get(path, content_receiver, progress);
    }

    std::shared_ptr<Response> Get(const char *path,
                                  const Headers &headers,
                                  ContentReceiver content_receiver,
                                  Progress progress) {
        return cli_->Get(path, headers, content_receiver, progress);
    }

    std::shared_ptr<Response> Get(const char *path,
                                  const Headers &headers,
                                  ResponseHandler response_handler,
                                  ContentReceiver content_receiver) {
        return cli_->Get(path, headers, response_handler, content_receiver);
    }

    std::shared_ptr<Response> Get(const char *path,
                                  const Headers &headers,
                                  ResponseHandler response_handler,
                                  ContentReceiver content_receiver,
                                  Progress progress) {
        return cli_->Get(path, headers, response_handler, content_receiver, progress);
    }

    std::shared_ptr<Response> Head(const char *path) {
        return cli_->Head(path);
    }

    std::shared_ptr<Response> Head(const char *path, const Headers &headers) {
        return cli_->Head(path, headers);
    }

    std::shared_ptr<Response> Post(const char *path) {
        return cli_->Post(path);
    }

    std::shared_ptr<Response> Post(const char *path, const std::string &body, const char *content_type) {
        return cli_->Post(path, body, content_type);
    }

    std::shared_ptr<Response> Post(const char *path,
                                   const Headers &headers,
                                   const std::string &body,
                                   const char *content_type) {
        return cli_->Post(path, headers, body, content_type);
    }

    std::shared_ptr<Response> Post(const char *path,
                                   size_t content_length,
                                   ContentProvider content_provider,
                                   const char *content_type) {
        return cli_->Post(path, content_length, content_provider, content_type);
    }

    std::shared_ptr<Response> Post(const char *path,
                                   const Headers &headers,
                                   size_t content_length,
                                   ContentProvider content_provider,
                                   const char *content_type) {
        return cli_->Post(path, headers, content_length, content_provider, content_type);
    }

    std::shared_ptr<Response> Post(const char *path, const Params &params) {
        return cli_->Post(path, params);
    }

    std::shared_ptr<Response> Post(const char *path, const Headers &headers, const Params &params) {
        return cli_->Post(path, headers, params);
    }

    std::shared_ptr<Response> Post(const char *path, const MultipartFormDataItems &items) {
        return cli_->Post(path, items);
    }

    std::shared_ptr<Response> Post(const char *path, const Headers &headers, const MultipartFormDataItems &items) {
        return cli_->Post(path, headers, items);
    }

    std::shared_ptr<Response> Put(const char *path) {
        return cli_->Put(path);
    }

    std::shared_ptr<Response> Put(const char *path, const std::string &body, const char *content_type) {
        return cli_->Put(path, body, content_type);
    }

    std::shared_ptr<Response> Put(const char *path,
                                  const Headers &headers,
                                  const std::string &body,
                                  const char *content_type) {
        return cli_->Put(path, headers, body, content_type);
    }

    std::shared_ptr<Response> Put(const char *path,
                                  size_t content_length,
                                  ContentProvider content_provider,
                                  const char *content_type) {
        return cli_->Put(path, content_length, content_provider, content_type);
    }

    std::shared_ptr<Response> Put(const char *path,
                                  const Headers &headers,
                                  size_t content_length,
                                  ContentProvider content_provider,
                                  const char *content_type) {
        return cli_->Put(path, headers, content_length, content_provider, content_type);
    }

    std::shared_ptr<Response> Put(const char *path, const Params &params) {
        return cli_->Put(path, params);
    }

    std::shared_ptr<Response> Put(const char *path, const Headers &headers, const Params &params) {
        return cli_->Put(path, headers, params);
    }

    std::shared_ptr<Response> Patch(const char *path, const std::string &body, const char *content_type) {
        return cli_->Patch(path, body, content_type);
    }

    std::shared_ptr<Response> Patch(const char *path,
                                    const Headers &headers,
                                    const std::string &body,
                                    const char *content_type) {
        return cli_->Patch(path, headers, body, content_type);
    }

    std::shared_ptr<Response> Patch(const char *path,
                                    size_t content_length,
                                    ContentProvider content_provider,
                                    const char *content_type) {
        return cli_->Patch(path, content_length, content_provider, content_type);
    }

    std::shared_ptr<Response> Patch(const char *path,
                                    const Headers &headers,
                                    size_t content_length,
                                    ContentProvider content_provider,
                                    const char *content_type) {
        return cli_->Patch(path, headers, content_length, content_provider, content_type);
    }

    std::shared_ptr<Response> Delete(const char *path) {
        return cli_->Delete(path);
    }

    std::shared_ptr<Response> Delete(const char *path, const std::string &body, const char *content_type) {
        return cli_->Delete(path, body, content_type);
    }

    std::shared_ptr<Response> Delete(const char *path, const Headers &headers) {
        return cli_->Delete(path, headers);
    }

    std::shared_ptr<Response> Delete(const char *path,
                                     const Headers &headers,
                                     const std::string &body,
                                     const char *content_type) {
        return cli_->Delete(path, headers, body, content_type);
    }

    std::shared_ptr<Response> Options(const char *path) {
        return cli_->Options(path);
    }

    std::shared_ptr<Response> Options(const char *path, const Headers &headers) {
        return cli_->Options(path, headers);
    }

    bool send(const Request &req, Response &res) {
        return cli_->send(req, res);
    }

    bool is_socket_open() {
        return cli_->is_socket_open();
    }

    void stop() {
        cli_->stop();
    }

    void set_tcp_nodelay(bool on) {
        cli_->set_tcp_nodelay(on);
    }

    void set_socket_options(SocketOptions socket_options) {
        cli_->set_socket_options(socket_options);
    }

    Client2 &set_connection_timeout(time_t sec, time_t usec) {
        cli_->set_connection_timeout(sec, usec);
        return *this;
    }

    Client2 &set_read_timeout(time_t sec, time_t usec) {
        cli_->set_read_timeout(sec, usec);
        return *this;
    }

    Client2 &set_basic_auth(const char *username, const char *password) {
        cli_->set_basic_auth(username, password);
        return *this;
    }

#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    Client2 &set_digest_auth(const char *username, const char *password) {
        cli_->set_digest_auth(username, password);
        return *this;
    }
#endif

    Client2 &set_keep_alive(bool on) {
        cli_->set_keep_alive(on);
        return *this;
    }

    Client2 &set_follow_location(bool on) {
        cli_->set_follow_location(on);
        return *this;
    }

    Client2 &set_compress(bool on) {
        cli_->set_compress(on);
        return *this;
    }

    Client2 &set_decompress(bool on) {
        cli_->set_decompress(on);
        return *this;
    }

    Client2 &set_interface(const char *intf) {
        cli_->set_interface(intf);
        return *this;
    }

    Client2 &set_proxy(const char *host, int port) {
        cli_->set_proxy(host, port);
        return *this;
    }

    Client2 &set_proxy_basic_auth(const char *username, const char *password) {
        cli_->set_proxy_basic_auth(username, password);
        return *this;
    }

#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    Client2 &set_proxy_digest_auth(const char *username, const char *password) {
        cli_->set_proxy_digest_auth(username, password);
        return *this;
    }
#endif

    Client2 &set_logger(Logger logger) {
        cli_->set_logger(logger);
        return *this;
    }

    // SSL
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    Client2 &set_ca_cert_path(const char *ca_cert_file_path, const char *ca_cert_dir_path = nullptr) {
        if (is_ssl_) {
            static_cast<SSLClient &>(*cli_).set_ca_cert_path(ca_cert_file_path, ca_cert_dir_path);
        }
        return *this;
    }

    Client2 &set_ca_cert_store(X509_STORE *ca_cert_store) {
        if (is_ssl_) {
            static_cast<SSLClient &>(*cli_).set_ca_cert_store(ca_cert_store);
        }
        return *this;
    }

    Client2 &enable_server_certificate_verification(bool enabled) {
        if (is_ssl_) {
            static_cast<SSLClient &>(*cli_).enable_server_certificate_verification(enabled);
        }
        return *this;
    }

    long get_openssl_verify_result() const {
        if (is_ssl_) {
            return static_cast<SSLClient &>(*cli_).get_openssl_verify_result();
        }
        return -1;  // NOTE: -1 doesn't match any of X509_V_ERR_???
    }

    SSL_CTX *ssl_context() const {
        if (is_ssl_) {
            return static_cast<SSLClient &>(*cli_).ssl_context();
        }
        return nullptr;
    }
#endif

  private:
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
    bool is_ssl_ = false;
#endif
    std::shared_ptr<Client> cli_;
};

// ----------------------------------------------------------------------------

/*
 * Implementation
 */

namespace detail {

inline bool is_hex(char c, int &v) {
    if (0x20 <= c && isdigit(c)) {
        v = c - '0';
        return true;
    } else if ('A' <= c && c <= 'F') {
        v = c - 'A' + 10;
        return true;
    } else if ('a' <= c && c <= 'f') {
        v = c - 'a' + 10;
        return true;
    }
    return false;
}

inline bool from_hex_to_i(const std::string &s, size_t i, size_t cnt, int &val) {
    if (i >= s.size()) {
        return false;
    }

    val = 0;
    for (; cnt; i++, cnt--) {
        if (!s[i]) {
            return false;
        }
        int v = 0;
        if (is_hex(s[i], v)) {
            val = val * 16 + v;
        } else {
            return false;
        }
    }
    return true;
}

inline std::string from_i_to_hex(size_t n) {
    const char *charset = "0123456789abcdef";
    std::string ret;
    do {
        ret = charset[n & 15] + ret;
        n >>= 4;
    } while (n > 0);
    return ret;
}

inline size_t to_utf8(int code, char *buff) {
    if (code < 0x0080) {
        buff[0] = (code & 0x7F);
        return 1;
    } else if (code < 0x0800) {
        buff[0] = static_cast<char>(0xC0 | ((code >> 6) & 0x1F));
        buff[1] = static_cast<char>(0x80 | (code & 0x3F));
        return 2;
    } else if (code < 0xD800) {
        buff[0] = static_cast<char>(0xE0 | ((code >> 12) & 0xF));
        buff[1] = static_cast<char>(0x80 | ((code >> 6) & 0x3F));
        buff[2] = static_cast<char>(0x80 | (code & 0x3F));
        return 3;
    } else if (code < 0xE000) {  // D800 - DFFF is invalid...
        return 0;
    } else if (code < 0x10000) {
        buff[0] = static_cast<char>(0xE0 | ((code >> 12) & 0xF));
        buff[1] = static_cast<char>(0x80 | ((code >> 6) & 0x3F));
        buff[2] = static_cast<char>(0x80 | (code & 0x3F));
        return 3;
    } else if (code < 0x110000) {
        buff[0] = static_cast<char>(0xF0 | ((code >> 18) & 0x7));
        buff[1] = static_cast<char>(0x80 | ((code >> 12) & 0x3F));
        buff[2] = static_cast<char>(0x80 | ((code >> 6) & 0x3F));
        buff[3] = static_cast<char>(0x80 | (code & 0x3F));
        return 4;
    }

    // NOTREACHED
    return 0;
}

// NOTE: This code came up with the following stackoverflow post:
// https://stackoverflow.com/questions/180947/base64-decode-snippet-in-c
inline std::string base64_encode(const std::string &in) {
    static const auto lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    std::string out;
    out.reserve(in.size());

    int val = 0;
    int valb = -6;

    for (auto c : in) {
        val = (val << 8) + static_cast<uint8_t>(c);
        valb += 8;
        while (valb >= 0) {
            out.push_back(lookup[(val >> valb) & 0x3F]);
            valb -= 6;
        }
    }

    if (valb > -6) {
        out.push_back(lookup[((val << 8) >> (valb + 8)) & 0x3F]);
    }

    while (out.size() % 4) {
        out.push_back('=');
    }

    return out;
}

inline bool is_file(const std::string &path) {
    struct stat st;
    return stat(path.c_str(), &st) >= 0 && S_ISREG(st.st_mode);
}

inline bool is_dir(const std::string &path) {
    struct stat st;
    return stat(path.c_str(), &st) >= 0 && S_ISDIR(st.st_mode);
}

inline bool is_valid_path(const std::string &path) {
    size_t level = 0;
    size_t i = 0;

    // Skip slash
    while (i < path.size() && path[i] == '/') {
        i++;
    }

    while (i < path.size()) {
        // Read component
        auto beg = i;
        while (i < path.size() && path[i] != '/') {
            i++;
        }

        auto len = i - beg;
        assert(len > 0);

        if (!path.compare(beg, len, ".")) {
            ;
        } else if (!path.compare(beg, len, "..")) {
            if (level == 0) {
                return false;
            }
            level--;
        } else {
            level++;
        }

        // Skip slash
        while (i < path.size() && path[i] == '/') {
            i++;
        }
    }

    return true;
}

inline void read_file(const std::string &path, std::string &out) {
    std::ifstream fs(path, std::ios_base::binary);
    fs.seekg(0, std::ios_base::end);
    auto size = fs.tellg();
    fs.seekg(0);
    out.resize(static_cast<size_t>(size));
    fs.read(&out[0], static_cast<std::streamsize>(size));
}

inline std::string file_extension(const std::string &path) {
    std::smatch m;
    static auto re = std::regex("\\.([a-zA-Z0-9]+)$");
    if (std::regex_search(path, m, re)) {
        return m[1].str();
    }
    return std::string();
}

template <class Fn>
void split(const char *b, const char *e, char d, Fn fn) {
    int i = 0;
    int beg = 0;

    while (e ? (b + i != e) : (b[i] != '\0')) {
        if (b[i] == d) {
            fn(&b[beg], &b[i]);
            beg = i + 1;
        }
        i++;
    }

    if (i) {
        fn(&b[beg], &b[i]);
    }
}

// NOTE: until the read size reaches `fixed_buffer_size`, use `fixed_buffer`
// to store data. The call can set memory on stack for performance.
class stream_line_reader {
  public:
    stream_line_reader(Stream &strm, char *fixed_buffer, size_t fixed_buffer_size)
        : strm_(strm), fixed_buffer_(fixed_buffer), fixed_buffer_size_(fixed_buffer_size) {}

    const char *ptr() const {
        if (glowable_buffer_.empty()) {
            return fixed_buffer_;
        } else {
            return glowable_buffer_.data();
        }
    }

    size_t size() const {
        if (glowable_buffer_.empty()) {
            return fixed_buffer_used_size_;
        } else {
            return glowable_buffer_.size();
        }
    }

    bool end_with_crlf() const {
        auto end = ptr() + size();
        return size() >= 2 && end[-2] == '\r' && end[-1] == '\n';
    }

    bool getline() {
        fixed_buffer_used_size_ = 0;
        glowable_buffer_.clear();

        for (size_t i = 0;; i++) {
            char byte;
            auto n = strm_.read(&byte, 1);

            if (n < 0) {
                return false;
            } else if (n == 0) {
                if (i == 0) {
                    return false;
                } else {
                    break;
                }
            }

            append(byte);

            if (byte == '\n') {
                break;
            }
        }

        return true;
    }

  private:
    void append(char c) {
        if (fixed_buffer_used_size_ < fixed_buffer_size_ - 1) {
            fixed_buffer_[fixed_buffer_used_size_++] = c;
            fixed_buffer_[fixed_buffer_used_size_] = '\0';
        } else {
            if (glowable_buffer_.empty()) {
                assert(fixed_buffer_[fixed_buffer_used_size_] == '\0');
                glowable_buffer_.assign(fixed_buffer_, fixed_buffer_used_size_);
            }
            glowable_buffer_ += c;
        }
    }

    Stream &strm_;
    char *fixed_buffer_;
    const size_t fixed_buffer_size_;
    size_t fixed_buffer_used_size_ = 0;
    std::string glowable_buffer_;
};

inline int close_socket(socket_t sock) {
#ifdef _WIN32
    return closesocket(sock);
#else
    return close(sock);
#endif
}

template <typename T>
inline ssize_t handle_EINTR(T fn) {
    ssize_t res = false;
    while (true) {
        res = fn();
        if (res < 0 && errno == EINTR) {
            continue;
        }
        break;
    }
    return res;
}

inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) {
#ifdef CPPHTTPLIB_USE_POLL
    struct pollfd pfd_read;
    pfd_read.fd = sock;
    pfd_read.events = POLLIN;

    auto timeout = static_cast<int>(sec * 1000 + usec);

    return handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); });
#else
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sock, &fds);

    timeval tv;
    tv.tv_sec = static_cast<long>(sec);
    tv.tv_usec = static_cast<decltype(tv.tv_usec)>(usec);

    return handle_EINTR([&]() { return select(static_cast<int>(sock + 1), &fds, nullptr, nullptr, &tv); });
#endif
}

inline ssize_t select_write(socket_t sock, time_t sec, time_t usec) {
#ifdef CPPHTTPLIB_USE_POLL
    struct pollfd pfd_read;
    pfd_read.fd = sock;
    pfd_read.events = POLLOUT;

    auto timeout = static_cast<int>(sec * 1000 + usec / 1000);

    return handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); });
#else
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sock, &fds);

    timeval tv;
    tv.tv_sec = static_cast<long>(sec);
    tv.tv_usec = static_cast<decltype(tv.tv_usec)>(usec);

    return handle_EINTR([&]() { return select(static_cast<int>(sock + 1), nullptr, &fds, nullptr, &tv); });
#endif
}

inline bool wait_until_socket_is_ready(socket_t sock, time_t sec, time_t usec) {
#ifdef CPPHTTPLIB_USE_POLL
    struct pollfd pfd_read;
    pfd_read.fd = sock;
    pfd_read.events = POLLIN | POLLOUT;

    auto timeout = static_cast<int>(sec * 1000 + usec);

    auto poll_res = handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); });

    if (poll_res > 0 && pfd_read.revents & (POLLIN | POLLOUT)) {
        int error = 0;
        socklen_t len = sizeof(error);
        auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, reinterpret_cast<char *>(&error), &len);
        return res >= 0 && !error;
    }
    return false;
#else
    fd_set fdsr;
    FD_ZERO(&fdsr);
    FD_SET(sock, &fdsr);

    auto fdsw = fdsr;
    auto fdse = fdsr;

    timeval tv;
    tv.tv_sec = static_cast<long>(sec);
    tv.tv_usec = static_cast<decltype(tv.tv_usec)>(usec);

    auto ret = handle_EINTR([&]() { return select(static_cast<int>(sock + 1), &fdsr, &fdsw, &fdse, &tv); });

    if (ret > 0 && (FD_ISSET(sock, &fdsr) || FD_ISSET(sock, &fdsw))) {
        int error = 0;
        socklen_t len = sizeof(error);
        return getsockopt(sock, SOL_SOCKET, SO_ERROR, reinterpret_cast<char *>(&error), &len) >= 0 && !error;
    }
    return false;
#endif
}

class SocketStream : public Stream {
  public:
    SocketStream(socket_t sock,
                 time_t read_timeout_sec,
                 time_t read_timeout_usec,
                 time_t write_timeout_sec,
                 time_t write_timeout_usec);
    ~SocketStream() override;

    bool is_readable() const override;
    bool is_writable() const override;
    ssize_t read(char *ptr, size_t size) override;
    ssize_t write(const char *ptr, size_t size) override;
    void get_remote_ip_and_port(std::string &ip, int &port) const override;

  private:
    socket_t sock_;
    time_t read_timeout_sec_;
    time_t read_timeout_usec_;
    time_t write_timeout_sec_;
    time_t write_timeout_usec_;
};

#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
class SSLSocketStream : public Stream {
  public:
    SSLSocketStream(socket_t sock,
                    SSL *ssl,
                    time_t read_timeout_sec,
                    time_t read_timeout_usec,
                    time_t write_timeout_sec,
                    time_t write_timeout_usec);
    ~SSLSocketStream() override;

    bool is_readable() const override;
    bool is_writable() const override;
    ssize_t read(char *ptr, size_t size) override;
    ssize_t write(const char *ptr, size_t size) override;
    void get_remote_ip_and_port(std::string &ip, int &port) const override;

  private:
    socket_t sock_;
    SSL *ssl_;
    time_t read_timeout_sec_;
    time_t read_timeout_usec_;
    time_t write_timeout_sec_;
    time_t write_timeout_usec_;
};
#endif

class BufferStream : public Stream {
  public:
    BufferStream() = default;
    ~BufferStream() override = default;

    bool is_readable() const override;
    bool is_writable() const override;
    ssize_t read(char *ptr, size_t size) override;
    ssize_t write(const char *ptr, size_t size) override;
    void get_remote_ip_and_port(std::string &ip, int &port) const override;

    const std::string &get_buffer() const;

  private:
    std::string buffer;
    size_t position = 0;
};

inline bool keep_alive(socket_t sock) {
    using namespace std::chrono;
    auto start = steady_clock::now();
    while (true) {
        auto val = select_read(sock, 0, 10000);
        if (val < 0) {
            return false;
        } else if (val == 0) {
            auto current = steady_clock::now();
            auto duration = duration_cast<milliseconds>(current - start);
            auto timeout = CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND * 100 + CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND;
            if (duration.count() > timeout) {
                return false;
            }
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
        } else {
            return true;
        }
    }
}

template <typename T>
inline bool process_client_socket(socket_t sock,
                                  time_t read_timeout_sec,
                                  time_t read_timeout_usec,
                                  time_t write_timeout_sec,
                                  time_t write_timeout_usec,
                                  T callback) {
    SocketStream strm(sock, read_timeout_sec, read_timeout_usec, write_timeout_sec, write_timeout_usec);
    return callback(strm);
}

inline int shutdown_socket(socket_t sock) {
#ifdef _WIN32
    return shutdown(sock, SD_BOTH);
#else
    return shutdown(sock, SHUT_RDWR);
#endif
}

template <typename BindOrConnect>
socket_t create_socket(const char *host,
                       int port,
                       int socket_flags,
                       bool tcp_nodelay,
                       SocketOptions socket_options,
                       BindOrConnect bind_or_connect) {
    // Get address info
    struct addrinfo hints;
    struct addrinfo *result;

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = socket_flags;
    hints.ai_protocol = 0;

    auto service = std::to_string(port);

    if (getaddrinfo(host, service.c_str(), &hints, &result)) {
        return INVALID_SOCKET;
    }

    for (auto rp = result; rp; rp = rp->ai_next) {
        // Create a socket
#ifdef _WIN32
        auto sock = WSASocketW(rp->ai_family, rp->ai_socktype, rp->ai_protocol, nullptr, 0, WSA_FLAG_NO_HANDLE_INHERIT);
        /**
         * Since the WSA_FLAG_NO_HANDLE_INHERIT is only supported on Windows 7 SP1
         * and above the socket creation fails on older Windows Systems.
         *
         * Let's try to create a socket the old way in this case.
         *
         * Reference:
         * https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa
         *
         * WSA_FLAG_NO_HANDLE_INHERIT:
         * This flag is supported on Windows 7 with SP1, Windows Server 2008 R2 with
         * SP1, and later
         *
         */
        if (sock == INVALID_SOCKET) {
            sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
        }
#else
        auto sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
#endif
        if (sock == INVALID_SOCKET) {
            continue;
        }

#ifndef _WIN32
        if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) {
            continue;
        }
#endif

        if (tcp_nodelay) {
            int yes = 1;
            setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<char *>(&yes), sizeof(yes));
        }

        if (socket_options) {
            socket_options(sock);
        }

        if (rp->ai_family == AF_INET6) {
            int no = 0;
            setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char *>(&no), sizeof(no));
        }

        // bind or connect
        if (bind_or_connect(sock, *rp)) {
            freeaddrinfo(result);
            return sock;
        }

        close_socket(sock);
    }

    freeaddrinfo(result);
    return INVALID_SOCKET;
}

inline void set_nonblocking(socket_t sock, bool nonblocking) {
#ifdef _WIN32
    auto flags = nonblocking ? 1UL : 0UL;
    ioctlsocket(sock, FIONBIO, &flags);
#else
    auto flags = fcntl(sock, F_GETFL, 0);
    fcntl(sock, F_SETFL, nonblocking ? (flags | O_NONBLOCK) : (flags & (~O_NONBLOCK)));
#endif
}

inline bool is_connection_error() {
#ifdef _WIN32
    return WSAGetLastError() != WSAEWOULDBLOCK;
#else
    return errno != EINPROGRESS;
#endif
}

inline bool bind_ip_address(socket_t sock, const char *host) {
    struct addrinfo hints;
    struct addrinfo *result;

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;

    if (getaddrinfo(host, "0", &hints, &result)) {
        return false;
    }

    auto ret = false;
    for (auto rp = result; rp; rp = rp->ai_next) {
        const auto &ai = *rp;
        if (!::bind(sock, ai.ai_addr, static_cast<socklen_t>(ai.ai_addrlen))) {
            ret = true;
            break;
        }
    }

    freeaddrinfo(result);
    return ret;
}

#ifndef _WIN32
inline std::string if2ip(const std::string &ifn) {
    struct ifaddrs *ifap;
    getifaddrs(&ifap);
    for (auto ifa = ifap; ifa; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr && ifn == ifa->ifa_name) {
            if (ifa->ifa_addr->sa_family == AF_INET) {
                auto sa = reinterpret_cast<struct sockaddr_in *>(ifa->ifa_addr);
                char buf[INET_ADDRSTRLEN];
                if (inet_ntop(AF_INET, &sa->sin_addr, buf, INET_ADDRSTRLEN)) {
                    freeifaddrs(ifap);
                    return std::string(buf, INET_ADDRSTRLEN);
                }
            }
        }
    }
    freeifaddrs(ifap);
    return std::string();
}
#endif

inline socket_t create_client_socket(const char *host,
                                     int port,
                                     bool tcp_nodelay,
                                     SocketOptions socket_options,
                                     time_t timeout_sec,
                                     time_t timeout_usec,
                                     const std::string &intf) {
    return create_socket(host, port, 0, tcp_nodelay, socket_options, [&](socket_t sock, struct addrinfo &ai) -> bool {
        if (!intf.empty()) {
#ifndef _WIN32
            auto ip = if2ip(intf);
            if (ip.empty()) {
                ip = intf;
            }
            if (!bind_ip_address(sock, ip.c_str())) {
                return false;
            }
#endif
        }

        set_nonblocking(sock, true);

        auto ret = ::connect(sock, ai.ai_addr, static_cast<socklen_t>(ai.ai_addrlen));
        if (ret < 0) {
            if (is_connection_error() || !wait_until_socket_is_ready(sock, timeout_sec, timeout_usec)) {
                close_socket(sock);
                return false;
            }
        }

        set_nonblocking(sock, false);
        return true;
    });
}

inline void get_remote_ip_and_port(const struct sockaddr_storage &addr,
                                   socklen_t addr_len,
                                   std::string &ip,
                                   int &port) {
    if (addr.ss_family == AF_INET) {
        port = ntohs(reinterpret_cast<const struct sockaddr_in *>(&addr)->sin_port);
    } else if (addr.ss_family == AF_INET6) {
        port = ntohs(reinterpret_cast<const struct sockaddr_in6 *>(&addr)->sin6_port);
    }

    std::array<char, NI_MAXHOST> ipstr{};
    if (!getnameinfo(reinterpret_cast<const struct sockaddr *>(&addr),
                     addr_len,
                     ipstr.data(),
                     static_cast<socklen_t>(ipstr.size()),
                     nullptr,
                     0,
                     NI_NUMERICHOST)) {
        ip = ipstr.data();
    }
}

inline void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) {
    struct sockaddr_storage addr;
    socklen_t addr_len = sizeof(addr);

    if (!getpeername(sock, reinterpret_cast<struct sockaddr *>(&addr), &addr_len)) {
        get_remote_ip_and_port(addr, addr_len, ip, port);
    }
}

inline const char *find_conten
Download .txt
gitextract_tv1z7_zt/

├── .clang-format
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE
│   ├── dependabot.yml
│   └── workflows/
│       ├── alpine.Dockerfile
│       ├── core.yml
│       ├── coverity.yml
│       ├── ext.yml
│       ├── framework.yml
│       ├── iouring.yml
│       ├── thread.yml
│       └── unit.yml
├── .gitignore
├── .php-cs-fixer.dist.php
├── CMakeLists.txt
├── Dockerfile
├── LICENSE
├── Makefile.frag
├── README.md
├── codecov.yml
├── composer.json
├── config.m4
├── core-tests/
│   ├── .gitignore
│   ├── code-stats.sh
│   ├── docker-compose.yml
│   ├── fuzz/
│   │   ├── project.json
│   │   └── src/
│   │       └── main.cpp
│   ├── include/
│   │   ├── httplib_client.h
│   │   ├── httplib_server.h
│   │   ├── redis_client.h
│   │   ├── test_core.h
│   │   ├── test_coroutine.h
│   │   ├── test_process.h
│   │   └── test_server.h
│   ├── js/
│   │   ├── .gitignore
│   │   ├── mqtt.js
│   │   ├── package.json
│   │   ├── ws_1.js
│   │   └── ws_2.js
│   ├── samples/
│   │   ├── CMakeLists.txt
│   │   └── src/
│   │       └── s1.cc
│   └── src/
│       ├── _lib/
│       │   ├── http.cpp
│       │   ├── process.cpp
│       │   ├── redis.cpp
│       │   ├── server.cpp
│       │   └── ssl.cpp
│       ├── core/
│       │   ├── base.cpp
│       │   ├── channel.cpp
│       │   ├── hash.cpp
│       │   ├── heap.cpp
│       │   ├── log.cpp
│       │   ├── string.cpp
│       │   ├── time.cpp
│       │   └── util.cpp
│       ├── coroutine/
│       │   ├── accept.cpp
│       │   ├── async.cpp
│       │   ├── base.cpp
│       │   ├── channel.cpp
│       │   ├── file.cpp
│       │   ├── gethostbyname.cpp
│       │   ├── hook.cpp
│       │   ├── http_server.cpp
│       │   ├── iouring.cpp
│       │   ├── socket.cpp
│       │   ├── system.cpp
│       │   └── uring_socket.cpp
│       ├── lock/
│       │   └── lock.cpp
│       ├── main.cpp
│       ├── memory/
│       │   ├── buffer.cpp
│       │   ├── fixed_pool.cpp
│       │   ├── global_memory.cpp
│       │   ├── lru_cache.cpp
│       │   ├── ringbuffer.cpp
│       │   └── table.cpp
│       ├── network/
│       │   ├── address.cpp
│       │   ├── client.cpp
│       │   ├── dns.cpp
│       │   ├── socket.cpp
│       │   └── stream.cpp
│       ├── os/
│       │   ├── async.cpp
│       │   ├── file.cpp
│       │   ├── msg_queue.cpp
│       │   ├── os.cpp
│       │   ├── pipe.cpp
│       │   ├── process_pool.cpp
│       │   ├── signal.cpp
│       │   ├── timer.cpp
│       │   └── wait.cpp
│       ├── protocol/
│       │   ├── base.cpp
│       │   ├── base64.cpp
│       │   ├── http2.cpp
│       │   ├── mime_type.cpp
│       │   ├── redis.cpp
│       │   └── ssl.cpp
│       ├── reactor/
│       │   └── base.cpp
│       └── server/
│           ├── buffer.cpp
│           ├── http_parser.cpp
│           ├── http_server.cpp
│           ├── message_bus.cpp
│           ├── mqtt.cpp
│           ├── multipart_parser.cpp
│           ├── port.cpp
│           └── server.cpp
├── docs/
│   ├── API.md
│   ├── CHANGELOG.md
│   ├── CODE-STYLE.md
│   ├── CPPLINT.cfg
│   ├── ISSUE.md
│   ├── SUPPORTED.md
│   ├── TESTS.md
│   ├── WORKFLOW-PARAMETERS.md
│   ├── google-style.xml
│   └── sponsors.md
├── examples/
│   ├── atomic/
│   │   ├── long.php
│   │   ├── test.php
│   │   └── wait.php
│   ├── client/
│   │   ├── c10k.php
│   │   ├── get_socket.php
│   │   ├── long_tcp.php
│   │   ├── recv_1m.php
│   │   ├── recv_file.php
│   │   ├── select.php
│   │   ├── simple.php
│   │   ├── sync.php
│   │   ├── test.txt
│   │   └── udp_sync.php
│   ├── coroutine/
│   │   ├── backtrace.php
│   │   ├── before_server_start.php
│   │   ├── behavior/
│   │   │   ├── do-while.php
│   │   │   ├── for.php
│   │   │   ├── foreach.php
│   │   │   ├── goto.php
│   │   │   ├── preemptive_timer.php
│   │   │   ├── tick.php
│   │   │   ├── while.php
│   │   │   └── while2.php
│   │   ├── cancel_throw.php
│   │   ├── channel/
│   │   │   └── test.php
│   │   ├── client_send_yield.php
│   │   ├── client_send_yield_server.php
│   │   ├── coro_array_map.php
│   │   ├── coro_call_user.php
│   │   ├── coro_channel.php
│   │   ├── coro_destruct.php
│   │   ├── coro_destuct.php
│   │   ├── coro_empty.php
│   │   ├── coro_gethost.php
│   │   ├── coro_include.php
│   │   ├── coro_invoke.php
│   │   ├── coro_nested.php
│   │   ├── coro_nested_empty.php
│   │   ├── coro_serialize.php
│   │   ├── coro_set_stack_size.php
│   │   ├── coro_sleep.php
│   │   ├── coro_stackless.php
│   │   ├── coro_util.php
│   │   ├── csp.php
│   │   ├── deadlock.php
│   │   ├── defer.php
│   │   ├── defer_client.php
│   │   ├── enable_coroutine.php
│   │   ├── exception/
│   │   │   └── empty.php
│   │   ├── exec.php
│   │   ├── exit_in_coroutine.php
│   │   ├── exit_with_status.php
│   │   ├── fgets.php
│   │   ├── fread.php
│   │   ├── fwrite.php
│   │   ├── gethostbyname.php
│   │   ├── http/
│   │   │   ├── server.php
│   │   │   └── write_func.php
│   │   ├── http2_client.php
│   │   ├── http_backend_serv.php
│   │   ├── http_client.php
│   │   ├── http_download.php
│   │   ├── http_server.php
│   │   ├── httpmulti.php
│   │   ├── join.php
│   │   ├── library/
│   │   │   └── base.php
│   │   ├── list_coroutines.php
│   │   ├── mysql_chan.php
│   │   ├── mysql_escape.php
│   │   ├── mysql_execute_empty.php
│   │   ├── mysql_prepare.php
│   │   ├── mysql_prepare_2.php
│   │   ├── mysql_procedure_exec.php
│   │   ├── mysql_query.php
│   │   ├── mysql_unixsocket.php
│   │   ├── pdo/
│   │   │   └── pdo_persistent.phpt
│   │   ├── proc_open.php
│   │   ├── reconnect_test.php
│   │   ├── redis/
│   │   │   ├── auth.php
│   │   │   ├── defer.php
│   │   │   ├── eval.php
│   │   │   ├── get.php
│   │   │   ├── multi.php
│   │   │   ├── pipeline.php
│   │   │   ├── pub.php
│   │   │   ├── request.php
│   │   │   ├── serialize.php
│   │   │   └── sub.php
│   │   ├── redis_pool.php
│   │   ├── redis_subscribe.php
│   │   ├── scheduler.php
│   │   ├── select/
│   │   │   ├── 1.php
│   │   │   ├── 2.php
│   │   │   ├── 3.php
│   │   │   ├── 4.php
│   │   │   ├── 5.php
│   │   │   ├── 6.php
│   │   │   ├── 7.php
│   │   │   ├── 8.php
│   │   │   ├── 9.php
│   │   │   ├── poptimeout.php
│   │   │   └── test.php
│   │   ├── send_yield.php
│   │   ├── send_yield_client.php
│   │   ├── server/
│   │   │   └── tcp.php
│   │   ├── sleep.php
│   │   ├── socket/
│   │   │   ├── accept.php
│   │   │   └── sendto.php
│   │   ├── stack/
│   │   │   ├── 1.php
│   │   │   └── 2.php
│   │   ├── stack.php
│   │   ├── statvfs.php
│   │   ├── task_co.php
│   │   ├── tcp_backend_serv.php
│   │   ├── tcp_echo.php
│   │   ├── test.php
│   │   ├── timer_test.php
│   │   ├── udp_client.php
│   │   ├── udp_tcp_timeout.php
│   │   ├── user_coroutine.php
│   │   ├── util/
│   │   │   ├── resume001.php
│   │   │   ├── resume002.php
│   │   │   └── resume003.php
│   │   ├── waitgroup.php
│   │   └── websocket/
│   │       ├── client.php
│   │       ├── co_server.php
│   │       └── server.php
│   ├── cpp/
│   │   ├── Makefile
│   │   ├── co.cc
│   │   ├── repeat.cc
│   │   └── test_server.cc
│   ├── curl/
│   │   ├── hook.php
│   │   ├── multi.php
│   │   └── server.php
│   ├── dtls/
│   │   ├── client.php
│   │   └── server.php
│   ├── eof/
│   │   ├── client.php
│   │   └── server.php
│   ├── event/
│   │   ├── cycle.php
│   │   ├── inotify.php
│   │   ├── sockets.php
│   │   ├── stdin.php
│   │   ├── stream.php
│   │   └── test.php
│   ├── http/
│   │   ├── UPPER.TXT
│   │   ├── client.php
│   │   ├── curl.php
│   │   ├── detach.php
│   │   ├── download.php
│   │   ├── empty.txt
│   │   ├── event-stream.php
│   │   ├── moc.moc
│   │   ├── no-compression.php
│   │   ├── post.data
│   │   ├── raw.php
│   │   ├── redirect.php
│   │   ├── server.php
│   │   ├── static_handler.php
│   │   ├── test.txt
│   │   └── url_rewrite.php
│   ├── http2/
│   │   ├── server.php
│   │   ├── streaming.php
│   │   └── test.html
│   ├── ipv6/
│   │   ├── tcp_client.php
│   │   ├── tcp_server.php
│   │   ├── udp_client.php
│   │   └── udp_server.php
│   ├── length/
│   │   ├── client.php
│   │   ├── config.php
│   │   ├── func.php
│   │   └── server.php
│   ├── lock/
│   │   └── lock.php
│   ├── misc/
│   │   ├── get_local_ip.php
│   │   ├── get_local_mac.php
│   │   └── version.php
│   ├── multicast/
│   │   ├── client.php
│   │   └── server.php
│   ├── php/
│   │   ├── buf_size.php
│   │   ├── debug_server.php
│   │   ├── error.php
│   │   ├── exception.php
│   │   ├── func.php
│   │   ├── inotify.php
│   │   ├── proc.php
│   │   ├── socket_client.php
│   │   ├── socket_server.php
│   │   ├── stream_client.php
│   │   ├── stream_server.php
│   │   └── tick.php
│   ├── postgresql/
│   │   └── postgresql_coro.php
│   ├── process/
│   │   ├── alarm.php
│   │   ├── async_master.php
│   │   ├── client.php
│   │   ├── client3.php
│   │   ├── close.php
│   │   ├── daemon.php
│   │   ├── echo.py
│   │   ├── exec.php
│   │   ├── func_timeout.php
│   │   ├── msg_pop.php
│   │   ├── msg_push.php
│   │   ├── msgqueue.php
│   │   ├── msgqueue2.php
│   │   ├── msgqueue_client.php
│   │   ├── msgqueue_pool.php
│   │   ├── pool_socket.php
│   │   ├── python.php
│   │   ├── select.php
│   │   ├── set_cpu_affinity.php
│   │   ├── stdin_stdout.php
│   │   ├── test.php
│   │   └── worker.php
│   ├── process_pool/
│   │   ├── detach.php
│   │   └── send.php
│   ├── runtime/
│   │   ├── coroutine.php
│   │   ├── curl.php
│   │   ├── file.php
│   │   ├── gethostbyname.php
│   │   ├── include.php
│   │   ├── mkdir.php
│   │   ├── mongodb.php
│   │   ├── oci.php
│   │   ├── odbc.php
│   │   ├── read.php
│   │   ├── rename.phpt
│   │   ├── select.php
│   │   ├── sleep.php
│   │   ├── sqlite.php
│   │   ├── ssl.php
│   │   ├── stream.php
│   │   ├── sync.php
│   │   ├── time_sleep_until.php
│   │   └── unlink.phpt
│   ├── server/
│   │   ├── db_pool.php
│   │   ├── dispatch_func.php
│   │   ├── dispatch_stream.php
│   │   ├── echo.php
│   │   ├── eof_client.php
│   │   ├── eof_server.php
│   │   ├── getReceivedTime.php
│   │   ├── host_update.php
│   │   ├── hot_update_class.php
│   │   ├── ip_dispatch.php
│   │   ├── length_client.php
│   │   ├── length_server.php
│   │   ├── listen_1k_port.php
│   │   ├── local_listener.php
│   │   ├── manager_timer.php
│   │   ├── mixed.php
│   │   ├── multi_instance.php
│   │   ├── multi_port.php
│   │   ├── pipe_message.php
│   │   ├── proxy_sync.php
│   │   ├── redis_pool.php
│   │   ├── reload_aysnc.php
│   │   ├── reload_force.php
│   │   ├── reload_force2.php
│   │   ├── send_1m.php
│   │   ├── sendfile.php
│   │   ├── single.php
│   │   ├── tcp_client.php
│   │   ├── tcp_server.php
│   │   ├── trace.php
│   │   ├── uid_dispatch.php
│   │   ├── unix_stream.php
│   │   └── zmq.php
│   ├── socket_coro/
│   │   ├── client.php
│   │   ├── server.php
│   │   └── udp.php
│   ├── ssl/
│   │   ├── ca/
│   │   │   ├── ca-cert.pem
│   │   │   ├── ca-key.pem
│   │   │   ├── ca-req.csr
│   │   │   ├── client-cert.pem
│   │   │   ├── client-key.pem
│   │   │   ├── client-req.csr
│   │   │   ├── client.crt
│   │   │   ├── client.key
│   │   │   ├── server-cert.pem
│   │   │   ├── server-key.pem
│   │   │   └── server-req.csr
│   │   ├── client.c
│   │   ├── client.php
│   │   ├── co_client.php
│   │   ├── gen_cert.md
│   │   ├── http_client.php
│   │   ├── passphrase.php
│   │   ├── server.php
│   │   ├── ssl.crt
│   │   ├── ssl.csr
│   │   ├── ssl.key
│   │   ├── ssl_passwd/
│   │   │   ├── ssl.crt
│   │   │   ├── ssl.csr
│   │   │   └── ssl.key
│   │   ├── stream_client.php
│   │   ├── swoole.log
│   │   ├── webserver.php
│   │   ├── websocket_client.html
│   │   └── websocket_server.php
│   ├── stdext/
│   │   ├── array.php
│   │   ├── foreach.php
│   │   ├── ref.php
│   │   ├── string.php
│   │   ├── typed_array.php
│   │   └── typed_array_map.php
│   ├── table/
│   │   ├── deadlock.php
│   │   ├── iterator.php
│   │   ├── server.php
│   │   ├── set.php
│   │   ├── simulation.php
│   │   └── usage.php
│   ├── task/
│   │   ├── http.php
│   │   ├── msg_push.php
│   │   ├── shared_client.php
│   │   ├── shared_server.php
│   │   ├── task.php
│   │   ├── task_coro.php
│   │   ├── task_num.php
│   │   ├── task_queue.php
│   │   └── task_stream.php
│   ├── thread/
│   │   ├── aio.php
│   │   ├── argv.php
│   │   ├── array.php
│   │   ├── atomic.php
│   │   ├── benchmark.php
│   │   ├── co.php
│   │   ├── exit.php
│   │   ├── hook.php
│   │   ├── lock.php
│   │   ├── map.php
│   │   ├── mt.php
│   │   ├── nested_map.php
│   │   ├── pipe.php
│   │   ├── run_test.php
│   │   ├── server.php
│   │   ├── signal.php
│   │   ├── socket.php
│   │   ├── test.php
│   │   ├── thread_pool.php
│   │   └── thread_server.php
│   ├── timer/
│   │   ├── after.php
│   │   ├── clear.php
│   │   ├── enable_coroutine.php
│   │   └── tick.php
│   ├── tracer/
│   │   ├── blocking.php
│   │   ├── cli.php
│   │   ├── co.php
│   │   ├── co_server.php
│   │   ├── co_socket.php
│   │   ├── fn_call.php
│   │   └── gc.php
│   ├── udp/
│   │   ├── client.php
│   │   └── server.php
│   ├── unixsock/
│   │   ├── dgram_client.php
│   │   ├── dgram_server.php
│   │   ├── stream_client.php
│   │   └── stream_server.php
│   ├── websocket/
│   │   ├── client.html
│   │   ├── client.php
│   │   └── server.php
│   └── www/
│       ├── dir1/
│       │   ├── file1.txt
│       │   └── file2.txt
│       ├── dir2/
│       │   ├── file1.txt
│       │   ├── file2.txt
│       │   └── index.txt
│       ├── file1.txt
│       ├── file2.txt
│       ├── index.html
│       └── index.txt
├── ext-src/
│   ├── php_swoole.cc
│   ├── php_swoole_call_stack.h
│   ├── php_swoole_client.h
│   ├── php_swoole_coroutine.h
│   ├── php_swoole_coroutine_system.h
│   ├── php_swoole_curl.h
│   ├── php_swoole_cxx.cc
│   ├── php_swoole_cxx.h
│   ├── php_swoole_firebird.h
│   ├── php_swoole_ftp_def.h
│   ├── php_swoole_http.h
│   ├── php_swoole_http_server.h
│   ├── php_swoole_library.h
│   ├── php_swoole_odbc.h
│   ├── php_swoole_oracle.h
│   ├── php_swoole_pgsql.h
│   ├── php_swoole_private.h
│   ├── php_swoole_process.h
│   ├── php_swoole_server.h
│   ├── php_swoole_sqlite.h
│   ├── php_swoole_ssh2.h
│   ├── php_swoole_ssh2_def.h
│   ├── php_swoole_ssh2_hook.h
│   ├── php_swoole_stdext.h
│   ├── php_swoole_thread.h
│   ├── php_swoole_websocket.h
│   ├── stubs/
│   │   ├── php_swoole.stub.php
│   │   ├── php_swoole_arginfo.h
│   │   ├── php_swoole_atomic.stub.php
│   │   ├── php_swoole_atomic_arginfo.h
│   │   ├── php_swoole_channel_coro.stub.php
│   │   ├── php_swoole_channel_coro_arginfo.h
│   │   ├── php_swoole_client.stub.php
│   │   ├── php_swoole_client_arginfo.h
│   │   ├── php_swoole_client_async.stub.php
│   │   ├── php_swoole_client_async_arginfo.h
│   │   ├── php_swoole_client_coro.stub.php
│   │   ├── php_swoole_client_coro_arginfo.h
│   │   ├── php_swoole_coroutine.stub.php
│   │   ├── php_swoole_coroutine_arginfo.h
│   │   ├── php_swoole_coroutine_lock.stub.php
│   │   ├── php_swoole_coroutine_lock_arginfo.h
│   │   ├── php_swoole_coroutine_scheduler.stub.php
│   │   ├── php_swoole_coroutine_scheduler_arginfo.h
│   │   ├── php_swoole_coroutine_system.stub.php
│   │   ├── php_swoole_coroutine_system_arginfo.h
│   │   ├── php_swoole_event.stub.php
│   │   ├── php_swoole_event_arginfo.h
│   │   ├── php_swoole_ex.stub.php
│   │   ├── php_swoole_ex_arginfo.h
│   │   ├── php_swoole_ftp.stub.php
│   │   ├── php_swoole_ftp_arginfo.h
│   │   ├── php_swoole_http2_client_coro.stub.php
│   │   ├── php_swoole_http2_client_coro_arginfo.h
│   │   ├── php_swoole_http_client_coro.stub.php
│   │   ├── php_swoole_http_client_coro_arginfo.h
│   │   ├── php_swoole_http_cookie.stub.php
│   │   ├── php_swoole_http_cookie_arginfo.h
│   │   ├── php_swoole_http_request.stub.php
│   │   ├── php_swoole_http_request_arginfo.h
│   │   ├── php_swoole_http_response.stub.php
│   │   ├── php_swoole_http_response_arginfo.h
│   │   ├── php_swoole_http_server_coro.stub.php
│   │   ├── php_swoole_http_server_coro_arginfo.h
│   │   ├── php_swoole_lock.stub.php
│   │   ├── php_swoole_lock_arginfo.h
│   │   ├── php_swoole_name_resolver.stub.php
│   │   ├── php_swoole_name_resolver_arginfo.h
│   │   ├── php_swoole_process.stub.php
│   │   ├── php_swoole_process_arginfo.h
│   │   ├── php_swoole_process_pool.stub.php
│   │   ├── php_swoole_process_pool_arginfo.h
│   │   ├── php_swoole_redis_server.stub.php
│   │   ├── php_swoole_redis_server_arginfo.h
│   │   ├── php_swoole_runtime.stub.php
│   │   ├── php_swoole_runtime_arginfo.h
│   │   ├── php_swoole_server.stub.php
│   │   ├── php_swoole_server_arginfo.h
│   │   ├── php_swoole_server_port.stub.php
│   │   ├── php_swoole_server_port_arginfo.h
│   │   ├── php_swoole_socket_coro.stub.php
│   │   ├── php_swoole_socket_coro_arginfo.h
│   │   ├── php_swoole_ssh2.stub.php
│   │   ├── php_swoole_ssh2_arginfo.h
│   │   ├── php_swoole_stdext.stub.php
│   │   ├── php_swoole_stdext_arginfo.h
│   │   ├── php_swoole_table.stub.php
│   │   ├── php_swoole_table_arginfo.h
│   │   ├── php_swoole_thread.stub.php
│   │   ├── php_swoole_thread_arginfo.h
│   │   ├── php_swoole_thread_arraylist.stub.php
│   │   ├── php_swoole_thread_arraylist_arginfo.h
│   │   ├── php_swoole_thread_atomic.stub.php
│   │   ├── php_swoole_thread_atomic_arginfo.h
│   │   ├── php_swoole_thread_barrier.stub.php
│   │   ├── php_swoole_thread_barrier_arginfo.h
│   │   ├── php_swoole_thread_lock.stub.php
│   │   ├── php_swoole_thread_lock_arginfo.h
│   │   ├── php_swoole_thread_map.stub.php
│   │   ├── php_swoole_thread_map_arginfo.h
│   │   ├── php_swoole_thread_queue.stub.php
│   │   ├── php_swoole_thread_queue_arginfo.h
│   │   ├── php_swoole_timer.stub.php
│   │   ├── php_swoole_timer_arginfo.h
│   │   ├── php_swoole_tracer.stub.php
│   │   ├── php_swoole_tracer_arginfo.h
│   │   ├── php_swoole_websocket.stub.php
│   │   └── php_swoole_websocket_arginfo.h
│   ├── swoole_admin_server.cc
│   ├── swoole_async_coro.cc
│   ├── swoole_atomic.cc
│   ├── swoole_channel_coro.cc
│   ├── swoole_client.cc
│   ├── swoole_client_async.cc
│   ├── swoole_client_coro.cc
│   ├── swoole_coroutine.cc
│   ├── swoole_coroutine_lock.cc
│   ├── swoole_coroutine_scheduler.cc
│   ├── swoole_coroutine_system.cc
│   ├── swoole_curl.cc
│   ├── swoole_curl_interface.h
│   ├── swoole_event.cc
│   ├── swoole_firebird.cc
│   ├── swoole_http2_client_coro.cc
│   ├── swoole_http2_server.cc
│   ├── swoole_http_client_coro.cc
│   ├── swoole_http_cookie.cc
│   ├── swoole_http_request.cc
│   ├── swoole_http_response.cc
│   ├── swoole_http_server.cc
│   ├── swoole_http_server_coro.cc
│   ├── swoole_lock.cc
│   ├── swoole_name_resolver.cc
│   ├── swoole_odbc.cc
│   ├── swoole_oracle.cc
│   ├── swoole_pgsql.cc
│   ├── swoole_process.cc
│   ├── swoole_process_pool.cc
│   ├── swoole_redis_server.cc
│   ├── swoole_runtime.cc
│   ├── swoole_server.cc
│   ├── swoole_server_port.cc
│   ├── swoole_socket_coro.cc
│   ├── swoole_sqlite.cc
│   ├── swoole_stdext.cc
│   ├── swoole_table.cc
│   ├── swoole_thread.cc
│   ├── swoole_thread_arraylist.cc
│   ├── swoole_thread_atomic.cc
│   ├── swoole_thread_barrier.cc
│   ├── swoole_thread_lock.cc
│   ├── swoole_thread_map.cc
│   ├── swoole_thread_queue.cc
│   ├── swoole_timer.cc
│   ├── swoole_tracer.cc
│   └── swoole_websocket_server.cc
├── gdbinit
├── include/
│   ├── helper/
│   │   └── kqueue.h
│   ├── swoole.h
│   ├── swoole_api.h
│   ├── swoole_asm_context.h
│   ├── swoole_async.h
│   ├── swoole_atomic.h
│   ├── swoole_base64.h
│   ├── swoole_buffer.h
│   ├── swoole_channel.h
│   ├── swoole_client.h
│   ├── swoole_config.h
│   ├── swoole_coroutine.h
│   ├── swoole_coroutine_api.h
│   ├── swoole_coroutine_channel.h
│   ├── swoole_coroutine_context.h
│   ├── swoole_coroutine_socket.h
│   ├── swoole_coroutine_system.h
│   ├── swoole_dtls.h
│   ├── swoole_error.h
│   ├── swoole_file.h
│   ├── swoole_file_hook.h
│   ├── swoole_hash.h
│   ├── swoole_heap.h
│   ├── swoole_http.h
│   ├── swoole_http2.h
│   ├── swoole_iouring.h
│   ├── swoole_llhttp.h
│   ├── swoole_lock.h
│   ├── swoole_log.h
│   ├── swoole_lru_cache.h
│   ├── swoole_memory.h
│   ├── swoole_message_bus.h
│   ├── swoole_mime_type.h
│   ├── swoole_mqtt.h
│   ├── swoole_msg_queue.h
│   ├── swoole_pipe.h
│   ├── swoole_process_pool.h
│   ├── swoole_protocol.h
│   ├── swoole_proxy.h
│   ├── swoole_reactor.h
│   ├── swoole_redis.h
│   ├── swoole_server.h
│   ├── swoole_signal.h
│   ├── swoole_socket.h
│   ├── swoole_socket_hook.h
│   ├── swoole_socket_impl.h
│   ├── swoole_ssl.h
│   ├── swoole_static_handler.h
│   ├── swoole_string.h
│   ├── swoole_table.h
│   ├── swoole_thread.h
│   ├── swoole_timer.h
│   ├── swoole_uring_socket.h
│   ├── swoole_util.h
│   ├── swoole_version.h
│   └── swoole_websocket.h
├── package.xml
├── php-cs-fix
├── php_swoole.h
├── php_swoole_api.h
├── run-core-tests.sh
├── scripts/
│   ├── .gitignore
│   ├── clear.sh
│   ├── code-format.sh
│   ├── code-stats.sh
│   ├── debug/
│   │   ├── swoole_info.php
│   │   └── swoole_table_implements.php
│   ├── docker-compile-with-iouring.sh
│   ├── docker-compile-with-thread.sh
│   ├── docker-compile.sh
│   ├── docker-compose.yml
│   ├── docker-iouring-route.sh
│   ├── docker-route.sh
│   ├── docker-thread-route.sh
│   ├── format-changed-files.sh
│   ├── install-deps-on-ubuntu.sh
│   ├── install-liburing.sh
│   ├── library.sh
│   ├── make.sh
│   ├── pecl-install.sh
│   ├── rename.php
│   ├── route.sh
│   ├── run-tests.sh
│   ├── simple-compile-on-github.sh
│   └── simple-compile.sh
├── src/
│   ├── core/
│   │   ├── base.cc
│   │   ├── base64.cc
│   │   ├── buffer.cc
│   │   ├── channel.cc
│   │   ├── crc32.cc
│   │   ├── error.cc
│   │   ├── heap.cc
│   │   ├── log.cc
│   │   ├── misc.cc
│   │   ├── string.cc
│   │   └── timer.cc
│   ├── coroutine/
│   │   ├── base.cc
│   │   ├── channel.cc
│   │   ├── context.cc
│   │   ├── file.cc
│   │   ├── file_lock.cc
│   │   ├── hook.cc
│   │   ├── iouring.cc
│   │   ├── socket.cc
│   │   ├── system.cc
│   │   ├── thread_context.cc
│   │   └── uring_socket.cc
│   ├── lock/
│   │   ├── barrier.cc
│   │   ├── coroutine_lock.cc
│   │   ├── mutex.cc
│   │   ├── rw_lock.cc
│   │   └── spin_lock.cc
│   ├── memory/
│   │   ├── fixed_pool.cc
│   │   ├── global_memory.cc
│   │   ├── ring_buffer.cc
│   │   ├── shared_memory.cc
│   │   └── table.cc
│   ├── network/
│   │   ├── address.cc
│   │   ├── client.cc
│   │   ├── dns.cc
│   │   ├── socket.cc
│   │   └── stream.cc
│   ├── os/
│   │   ├── async_thread.cc
│   │   ├── base.cc
│   │   ├── file.cc
│   │   ├── msg_queue.cc
│   │   ├── pipe.cc
│   │   ├── process_pool.cc
│   │   ├── sendfile.cc
│   │   ├── signal.cc
│   │   ├── timer.cc
│   │   ├── unix_socket.cc
│   │   └── wait.cc
│   ├── protocol/
│   │   ├── base.cc
│   │   ├── dtls.cc
│   │   ├── http.cc
│   │   ├── http2.cc
│   │   ├── message_bus.cc
│   │   ├── mime_type.cc
│   │   ├── mqtt.cc
│   │   ├── redis.cc
│   │   ├── socks5.cc
│   │   ├── ssl.cc
│   │   └── websocket.cc
│   ├── reactor/
│   │   ├── base.cc
│   │   ├── epoll.cc
│   │   ├── kqueue.cc
│   │   └── poll.cc
│   ├── server/
│   │   ├── base.cc
│   │   ├── manager.cc
│   │   ├── master.cc
│   │   ├── port.cc
│   │   ├── process.cc
│   │   ├── reactor_process.cc
│   │   ├── reactor_thread.cc
│   │   ├── static_handler.cc
│   │   ├── task_worker.cc
│   │   ├── thread.cc
│   │   └── worker.cc
│   └── wrapper/
│       ├── event.cc
│       ├── http.cc
│       └── timer.cc
├── tests/
│   ├── CONTRIBUTION
│   ├── README.md
│   ├── clean
│   ├── include/
│   │   ├── api/
│   │   │   ├── curl_multi.php
│   │   │   ├── exit.php
│   │   │   ├── http_server.php
│   │   │   ├── http_test_cases.php
│   │   │   ├── swoole_callback/
│   │   │   │   └── swoole_cannot_destroy_active_lambda_function.php
│   │   │   ├── swoole_client/
│   │   │   │   ├── connect_timeout.php
│   │   │   │   ├── connect_twice.php
│   │   │   │   ├── http_get.php
│   │   │   │   ├── opcode_client.php
│   │   │   │   ├── simple_client.php
│   │   │   │   └── socket_free.php
│   │   │   ├── swoole_http_server/
│   │   │   │   ├── http_server.php
│   │   │   │   ├── http_server_without_response.php
│   │   │   │   ├── simple_http_server.php
│   │   │   │   └── simple_https_server.php
│   │   │   ├── swoole_server/
│   │   │   │   ├── TestServer.php
│   │   │   │   ├── multi_protocol_server.php
│   │   │   │   ├── opcode_server.php
│   │   │   │   ├── reconnect_fail/
│   │   │   │   │   ├── tcp_client.php
│   │   │   │   │   └── tcp_serv.php
│   │   │   │   ├── server_manager_process_exit.php
│   │   │   │   ├── server_send_fast_recv_slow.php
│   │   │   │   ├── simple_server.php
│   │   │   │   ├── simple_tcp_server.php
│   │   │   │   ├── simple_udp_server.php
│   │   │   │   ├── tcp_serv.php
│   │   │   │   ├── tcp_task_server.php
│   │   │   │   └── testsendfile.txt
│   │   │   ├── swoole_thread/
│   │   │   │   ├── putenv.php
│   │   │   │   └── sleep.php
│   │   │   ├── swoole_timer/
│   │   │   │   ├── accurate_test.php
│   │   │   │   ├── fixRate_vs_fixDelay.php
│   │   │   │   ├── invalid_args.php
│   │   │   │   ├── multi_timer.php
│   │   │   │   └── register_shutdown_priority.php
│   │   │   ├── swoole_websocket_server/
│   │   │   │   ├── send_large_request_data.php
│   │   │   │   ├── send_small_request_data.php
│   │   │   │   ├── swoole_websocket_server.php
│   │   │   │   └── websocket_client.php
│   │   │   ├── syntax_error.txt
│   │   │   ├── tcp_server.php
│   │   │   └── test_classes/
│   │   │       ├── A.php
│   │   │       ├── A2.php
│   │   │       └── B.php
│   │   ├── bootstrap.php
│   │   ├── config.php
│   │   ├── functions.php
│   │   ├── lib/
│   │   │   ├── composer.json
│   │   │   └── src/
│   │   │       ├── Assert.php
│   │   │       ├── ChildProcess.php
│   │   │       ├── CoServer.php
│   │   │       ├── CurlManager.php
│   │   │       ├── DbWrapper.php
│   │   │       ├── LengthServer.php
│   │   │       ├── MQTT/
│   │   │       │   └── Helper.php
│   │   │       ├── MysqlPool.php
│   │   │       ├── ProcessManager.php
│   │   │       ├── RandStr.php
│   │   │       ├── Redis/
│   │   │       │   ├── DBConnectException.php
│   │   │       │   ├── Lock.php
│   │   │       │   ├── Redis.php
│   │   │       │   └── SQLPool.php
│   │   │       ├── Samtleben/
│   │   │       │   └── WebsocketClient.php
│   │   │       ├── ServerManager.php
│   │   │       ├── TcpStat.php
│   │   │       ├── ThreadManager.php
│   │   │       ├── WaitRef.php
│   │   │       └── responder/
│   │   │           └── get.php
│   │   ├── macos/
│   │   │   └── phpstorm.py
│   │   ├── skipif.inc
│   │   └── ssl_certs/
│   │       ├── ca-cert.pem
│   │       ├── ca-key.pem
│   │       ├── ca-req.csr
│   │       ├── ca.crt
│   │       ├── ca.csr
│   │       ├── ca.key
│   │       ├── ca.srl
│   │       ├── client-cert.pem
│   │       ├── client-expired.crt
│   │       ├── client-expired.csr
│   │       ├── client-expired.key
│   │       ├── client-key.pem
│   │       ├── client-req.csr
│   │       ├── client.crt
│   │       ├── client.csr
│   │       ├── client.key
│   │       ├── client.pem
│   │       ├── dhparams.pem
│   │       ├── mosquitto.org.crt
│   │       ├── passwd.crt
│   │       ├── passwd_key.pem
│   │       ├── server-cert.pem
│   │       ├── server-key.pem
│   │       ├── server-req.csr
│   │       ├── server.crt
│   │       ├── server.csr
│   │       ├── server.key
│   │       ├── server.pem
│   │       ├── sni_server_ca.pem
│   │       ├── sni_server_cs.pem
│   │       ├── sni_server_cs_cert.pem
│   │       ├── sni_server_cs_key.pem
│   │       ├── sni_server_uk.pem
│   │       ├── sni_server_uk_cert.pem
│   │       ├── sni_server_uk_key.pem
│   │       ├── sni_server_us.pem
│   │       ├── sni_server_us_cert.pem
│   │       └── sni_server_us_key.pem
│   ├── init
│   ├── new
│   ├── pgsql.sql
│   ├── run-tests
│   ├── start.sh
│   ├── swoole_atomic/
│   │   ├── atomic.phpt
│   │   ├── dtor_in_child.phpt
│   │   ├── multi_wakeup.phpt
│   │   ├── wait.phpt
│   │   ├── wait_and_wakeup.phpt
│   │   └── wait_ex.phpt
│   ├── swoole_channel_coro/
│   │   ├── 1.phpt
│   │   ├── 10.phpt
│   │   ├── 2.phpt
│   │   ├── 3.phpt
│   │   ├── 4.phpt
│   │   ├── 5.phpt
│   │   ├── 6.phpt
│   │   ├── 7.phpt
│   │   ├── 8.phpt
│   │   ├── 9.phpt
│   │   ├── basic.phpt
│   │   ├── benchmark.phpt
│   │   ├── blocking_timeout.phpt
│   │   ├── bug_1947.phpt
│   │   ├── bug_clear_timer.phpt
│   │   ├── chan_select_timeout.phpt
│   │   ├── chan_stats.phpt
│   │   ├── close.phpt
│   │   ├── coro_wait.phpt
│   │   ├── discard.phpt
│   │   ├── fibonacci.phpt
│   │   ├── http2.phpt
│   │   ├── hybird_chan.phpt
│   │   ├── hybird_chan2.phpt
│   │   ├── hybird_chan3.phpt
│   │   ├── lock.phpt
│   │   ├── no_ctor.phpt
│   │   ├── pool.phpt
│   │   ├── pop_after_close.phpt
│   │   ├── pop_close1.phpt
│   │   ├── pop_timeout1.phpt
│   │   ├── pop_timeout2.phpt
│   │   ├── pop_timeout3.phpt
│   │   ├── pop_timeout4.phpt
│   │   ├── pop_timeout5.phpt
│   │   ├── pop_timeout6.phpt
│   │   ├── pop_timeout7.phpt
│   │   ├── pop_timeout8.phpt
│   │   ├── push_close1.phpt
│   │   ├── push_timeout1.phpt
│   │   ├── push_timeout2.phpt
│   │   ├── push_timeout3.phpt
│   │   ├── push_timeout4.phpt
│   │   └── type.phpt
│   ├── swoole_client_async/
│   │   ├── base.phpt
│   │   ├── big_package_memory_leak.phpt
│   │   ├── buffer_full.phpt
│   │   ├── connect_dns.phpt
│   │   ├── connect_refuse.phpt
│   │   ├── connect_refuse_udg.phpt
│   │   ├── connect_refuse_unix.phpt
│   │   ├── connect_timeout.phpt
│   │   ├── connect_twice.phpt
│   │   ├── enableSSL.phpt
│   │   ├── enableSSL_bad_callback.phpt
│   │   ├── enableSSL_before_connect.phpt
│   │   ├── eof.phpt
│   │   ├── eof_close.phpt
│   │   ├── getSocket_bug.phpt
│   │   ├── getpeername.phpt
│   │   ├── getsockname.phpt
│   │   ├── length_protocol.phpt
│   │   ├── length_protocol_func.phpt
│   │   ├── port_invalid.phpt
│   │   ├── sendfile.phpt
│   │   └── sleep_wake.phpt
│   ├── swoole_client_coro/
│   │   ├── bug_2346.phpt
│   │   ├── close.phpt
│   │   ├── close_in_other_co.phpt
│   │   ├── close_resume.phpt
│   │   ├── close_socket_property.phpt
│   │   ├── close_twice.phpt
│   │   ├── connect_dns_timeout.phpt
│   │   ├── connect_timeout.phpt
│   │   ├── connect_with_dns.phpt
│   │   ├── dtls.phpt
│   │   ├── enableSSL.phpt
│   │   ├── eof.phpt
│   │   ├── eof_02.phpt
│   │   ├── eof_03.phpt
│   │   ├── eof_04.phpt
│   │   ├── export_socket.phpt
│   │   ├── fixed_package.phpt
│   │   ├── getpeername.phpt
│   │   ├── getsockname.phpt
│   │   ├── isConnected.phpt
│   │   ├── length_01.phpt
│   │   ├── length_02.phpt
│   │   ├── length_03.phpt
│   │   ├── length_04.phpt
│   │   ├── length_protocol_func.phpt
│   │   ├── length_types.phpt
│   │   ├── read_and_write.phpt
│   │   ├── reconnect.phpt
│   │   ├── reconnect_2.phpt
│   │   ├── reconnect_3.phpt
│   │   ├── recv_after_close.phpt
│   │   ├── recv_bad_packet.phpt
│   │   ├── recv_timeout.phpt
│   │   ├── recv_timeout2.phpt
│   │   ├── recvfrom.phpt
│   │   ├── recvfrom_2.phpt
│   │   ├── recvfrom_timeout.phpt
│   │   ├── recvfrom_timeout2.phpt
│   │   ├── send_big.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendto.phpt
│   │   ├── ssl.phpt
│   │   ├── ssl_verify.phpt
│   │   ├── tcp_client.phpt
│   │   ├── tcp_nodelay.phpt
│   │   ├── timeout.phpt
│   │   ├── udp_client.phpt
│   │   ├── udp_recv_failed.phpt
│   │   ├── unsock_dgram.phpt
│   │   └── unsock_stream.phpt
│   ├── swoole_client_sync/
│   │   ├── bind_address.phpt
│   │   ├── connect_1.phpt
│   │   ├── connect_2.phpt
│   │   ├── connect_3.phpt
│   │   ├── enableSSL.phpt
│   │   ├── enableSSL_2.phpt
│   │   ├── eof.phpt
│   │   ├── eof_close.phpt
│   │   ├── eof_timeout.phpt
│   │   ├── http_proxy.phpt
│   │   ├── keep1.phpt
│   │   ├── keep2.phpt
│   │   ├── keep3.phpt
│   │   ├── keep4.phpt
│   │   ├── keep5.phpt
│   │   ├── keep6.phpt
│   │   ├── length_protocol.phpt
│   │   ├── length_protocol_02.phpt
│   │   ├── length_protocol_func.phpt
│   │   ├── recv_in_task.phpt
│   │   ├── recv_timeout.phpt
│   │   ├── recv_with_open_eof_check.phpt
│   │   ├── select.phpt
│   │   ├── select_null.phpt
│   │   ├── send_recv.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendto.phpt
│   │   ├── socks5_proxy.phpt
│   │   ├── ssl_recv_timeout.phpt
│   │   ├── sync_send_recv.phpt
│   │   ├── udg_send_timeout.phpt
│   │   └── udp_client_sendto.phpt
│   ├── swoole_coroutine/
│   │   ├── after_start_server_1.phpt
│   │   ├── all_asleep.phpt
│   │   ├── array_walk.phpt
│   │   ├── array_walk_deep.phpt
│   │   ├── async_callback/
│   │   │   ├── event_cycle.phpt
│   │   │   ├── signal.phpt
│   │   │   └── timer.phpt
│   │   ├── autoload.phpt
│   │   ├── autoload_not_found.phpt
│   │   ├── autoload_not_found_not_in_coroutine.phpt
│   │   ├── autoload_not_in_coroutine.phpt
│   │   ├── bailout/
│   │   │   ├── co_redis_in_shutdown_function.phpt
│   │   │   ├── error.phpt
│   │   │   ├── error_in.phpt
│   │   │   ├── error_internal.phpt
│   │   │   ├── error_internal2.phpt
│   │   │   ├── error_out.phpt
│   │   │   └── exit.phpt
│   │   ├── before_create_server_1.phpt
│   │   ├── before_create_server_2.phpt
│   │   ├── before_create_server_3.phpt
│   │   ├── bug_2387.phpt
│   │   ├── bug_5699.phpt
│   │   ├── c_stack_size.phpt
│   │   ├── call_not_exists_func.phpt
│   │   ├── call_user_func_array.phpt
│   │   ├── call_user_func_array2.phpt
│   │   ├── call_with_args.phpt
│   │   ├── callback.phpt
│   │   ├── cancel/
│   │   │   ├── channel_pop.phpt
│   │   │   ├── channel_push.phpt
│   │   │   ├── error.phpt
│   │   │   ├── gethostbyname.phpt
│   │   │   ├── kill.phpt
│   │   │   ├── sleep.phpt
│   │   │   ├── socket.phpt
│   │   │   ├── suspend.phpt
│   │   │   ├── throw_exception.phpt
│   │   │   ├── wait.phpt
│   │   │   ├── wait_event.phpt
│   │   │   └── wait_signal.phpt
│   │   ├── check.phpt
│   │   ├── cid.phpt
│   │   ├── create_after_rshutdown.phpt
│   │   ├── current.phpt
│   │   ├── dead_lock.phpt
│   │   ├── defer/
│   │   │   ├── defer.phpt
│   │   │   ├── defer_close.phpt
│   │   │   ├── defer_exception.phpt
│   │   │   └── defer_in_try.phpt
│   │   ├── destruct/
│   │   │   ├── destruct1.phpt
│   │   │   ├── destruct2.phpt
│   │   │   └── destruct3.phpt
│   │   ├── dnslookup_1.phpt
│   │   ├── dnslookup_2.phpt
│   │   ├── dnslookup_3.phpt
│   │   ├── dnslookup_4.phpt
│   │   ├── dnslookup_5.phpt
│   │   ├── dnslookup_ipv6.phpt
│   │   ├── dnslookup_query_hosts.phpt
│   │   ├── empty.phpt
│   │   ├── eval.phpt
│   │   ├── exception/
│   │   │   ├── core_error.phpt
│   │   │   ├── defer1.phpt
│   │   │   ├── defer2.phpt
│   │   │   ├── dtor.phpt
│   │   │   ├── empty.phpt
│   │   │   ├── error.phpt
│   │   │   ├── error1.phpt
│   │   │   ├── error2.phpt
│   │   │   ├── error3.phpt
│   │   │   ├── fatal_error.phpt
│   │   │   ├── nested.phpt
│   │   │   ├── yield.phpt
│   │   │   └── yield1.phpt
│   │   ├── exception.phpt
│   │   ├── execute_time.phpt
│   │   ├── exists.phpt
│   │   ├── exit.phpt
│   │   ├── exit_84.phpt
│   │   ├── exit_exception_backtrace.phpt
│   │   ├── exit_exception_backtrace_84.phpt
│   │   ├── fatal_error.phpt
│   │   ├── forbidden_case/
│   │   │   ├── array_map.phpt
│   │   │   ├── call_user.phpt
│   │   │   └── invoke.phpt
│   │   ├── getContext.phpt
│   │   ├── getElasped.phpt
│   │   ├── getPcid.phpt
│   │   ├── getPcid_by_random_cid.phpt.phpt
│   │   ├── gethostbyname.phpt
│   │   ├── iterator.phpt
│   │   ├── join/
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── 6.phpt
│   │   │   ├── 7.phpt
│   │   │   └── 8.phpt
│   │   ├── kernel_coroutine.phpt
│   │   ├── list_and_backtrace.phpt
│   │   ├── max_num.phpt
│   │   ├── max_num_limit.phpt
│   │   ├── nested1.phpt
│   │   ├── nested2.phpt
│   │   ├── nested3.phpt
│   │   ├── nested_empty.phpt
│   │   ├── nested_uid.phpt
│   │   ├── new_process.phpt
│   │   ├── new_server.phpt
│   │   ├── no_inline_func.phpt
│   │   ├── output/
│   │   │   ├── concurrency.phpt
│   │   │   ├── create.phpt
│   │   │   ├── in_nested_co.phpt
│   │   │   ├── ob_main.phpt
│   │   │   └── output_control.phpt
│   │   ├── parallel1.phpt
│   │   ├── parallel2.phpt
│   │   ├── parallel3.phpt
│   │   ├── pdo_error_handing.phpt
│   │   ├── private_access.phpt
│   │   ├── resume_loop.phpt
│   │   ├── scheduler.phpt
│   │   ├── signal_listener.phpt
│   │   ├── stats.phpt
│   │   ├── timeout.phpt
│   │   ├── use_process.phpt
│   │   ├── user_coroutine.phpt
│   │   └── user_coroutine_2.phpt
│   ├── swoole_coroutine_lock/
│   │   ├── lock.phpt
│   │   ├── trylock.phpt
│   │   └── trylock2.phpt
│   ├── swoole_coroutine_scheduler/
│   │   ├── getOptions.phpt
│   │   ├── hook_flags.phpt
│   │   ├── hook_flags_2.phpt
│   │   ├── parallel.phpt
│   │   ├── preemptive/
│   │   │   ├── disable.phpt
│   │   │   ├── disable2.phpt
│   │   │   ├── do-while.phpt
│   │   │   ├── do-while2.phpt
│   │   │   ├── do-while3.phpt
│   │   │   ├── for.phpt
│   │   │   ├── for2.phpt
│   │   │   ├── goto.phpt
│   │   │   ├── goto2.phpt
│   │   │   ├── timer.phpt
│   │   │   ├── while.phpt
│   │   │   ├── while2.phpt
│   │   │   └── while3.phpt
│   │   ├── repeat.phpt
│   │   ├── resume1.phpt
│   │   ├── resume2.phpt
│   │   ├── resume3.phpt
│   │   ├── resume4.phpt
│   │   ├── resume5.phpt
│   │   ├── resume6.phpt
│   │   ├── start.phpt
│   │   ├── start_in_server_shutdown.phpt
│   │   └── start_in_server_worker_stop.phpt
│   ├── swoole_coroutine_system/
│   │   ├── aio_thread_num.phpt
│   │   ├── getaddrinfo.phpt
│   │   ├── getaddrinfo_timeout.phpt
│   │   ├── gethostbyname.phpt
│   │   ├── gethostbyname_ipv6.phpt
│   │   ├── gethostbyname_timeout.phpt
│   │   ├── readfile.phpt
│   │   ├── sleep.phpt
│   │   ├── wait.phpt
│   │   ├── waitEvent.phpt
│   │   ├── waitPid.phpt
│   │   ├── waitSignal.phpt
│   │   ├── waitSignal_2.phpt
│   │   ├── writefile.phpt
│   │   └── writefile_append.phpt
│   ├── swoole_coroutine_util/
│   │   ├── dns_lookup.phpt
│   │   ├── exec.phpt
│   │   ├── exec_sleep.phpt
│   │   ├── fgets.phpt
│   │   ├── fread.phpt
│   │   ├── fwrite.phpt
│   │   ├── list_coroutine.phpt
│   │   └── task_worker.phpt
│   ├── swoole_coroutine_wait_group/
│   │   ├── base.phpt
│   │   ├── defer.phpt
│   │   ├── empty.phpt
│   │   └── logic.phpt
│   ├── swoole_curl/
│   │   ├── abnormal_response/
│   │   │   ├── 1.phpt
│   │   │   └── 2.phpt
│   │   ├── basic/
│   │   │   ├── 1.phpt
│   │   │   ├── 10.phpt
│   │   │   ├── 11.phpt
│   │   │   ├── 12.phpt
│   │   │   ├── 13.phpt
│   │   │   ├── 14.phpt
│   │   │   ├── 15.phpt
│   │   │   ├── 19.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 20.phpt
│   │   │   ├── 21.phpt
│   │   │   ├── 22.phpt
│   │   │   ├── 23.phpt
│   │   │   ├── 24.phpt
│   │   │   ├── 25.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── 7.phpt
│   │   │   ├── 8.phpt
│   │   │   └── 9.phpt
│   │   ├── cancel.phpt
│   │   ├── close_before_resume.phpt
│   │   ├── concurrent.phpt
│   │   ├── coro_read.phpt
│   │   ├── coro_write.phpt
│   │   ├── coro_write_header.phpt
│   │   ├── error.phpt
│   │   ├── event_exit.phpt
│   │   ├── exec_twice.phpt
│   │   ├── fatal_error_in_callback.phpt
│   │   ├── ftp.phpt
│   │   ├── guzzle/
│   │   │   ├── cancel.phpt
│   │   │   ├── cannot_cancel_finished.phpt
│   │   │   ├── cookie.phpt
│   │   │   ├── promise.phpt
│   │   │   ├── request_async.phpt
│   │   │   ├── request_on_stats.phpt
│   │   │   └── send_async.phpt
│   │   ├── guzzle.phpt
│   │   ├── https.phpt
│   │   ├── keepalive.phpt
│   │   ├── multi/
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── 6.phpt
│   │   │   ├── add_after_easy_exec.phpt
│   │   │   ├── bug4393.phpt
│   │   │   ├── bug48203_multi.phpt
│   │   │   ├── bug67643.phpt
│   │   │   ├── bug71523.phpt
│   │   │   ├── bug76675.phpt
│   │   │   ├── bug77535.phpt
│   │   │   ├── bug77946.phpt
│   │   │   ├── close.phpt
│   │   │   ├── curl_basic_018.phpt
│   │   │   ├── curl_copy_handle_variation4.phpt
│   │   │   ├── curl_int_cast.phpt
│   │   │   ├── curl_multi_close_basic.phpt
│   │   │   ├── curl_multi_close_basic001.phpt
│   │   │   ├── curl_multi_close_reference.phpt
│   │   │   ├── curl_multi_errno_strerror_001.phpt
│   │   │   ├── curl_multi_getcontent_basic3.phpt
│   │   │   ├── curl_multi_info_read.phpt
│   │   │   ├── curl_multi_init_basic.phpt
│   │   │   ├── curl_multi_segfault.phpt
│   │   │   ├── curl_multi_select_basic1.phpt
│   │   │   ├── curl_multi_setopt_basic001.phpt
│   │   │   ├── dtor.phpt
│   │   │   ├── multiple_binding.phpt
│   │   │   ├── no_hook.phpt
│   │   │   ├── select_cancel.phpt
│   │   │   ├── select_timeout.phpt
│   │   │   └── select_twice.phpt
│   │   ├── non_exclusive.phpt
│   │   ├── setopt/
│   │   │   ├── 1.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5_skip.phpt
│   │   │   ├── filetime_1.phpt
│   │   │   ├── filetime_2.phpt
│   │   │   ├── header_out.phpt
│   │   │   ├── infile.phpt
│   │   │   └── nobody.phpt
│   │   ├── share/
│   │   │   ├── 1.phpt
│   │   │   └── 5.phpt
│   │   ├── sleep.phpt
│   │   ├── ssl/
│   │   │   └── version.phpt
│   │   ├── symfony-noco.phpt
│   │   ├── symfony.phpt
│   │   ├── template
│   │   ├── timer_coredump.phpt
│   │   ├── undefined_behavior/
│   │   │   ├── 0.phpt
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── 6.phpt
│   │   │   ├── 7.phpt
│   │   │   └── 8.phpt
│   │   ├── upload/
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── curl_testdata1.txt
│   │   │   └── curl_testdata2.txt
│   │   └── yield_in_callback.phpt
│   ├── swoole_event/
│   │   ├── add_after_server_start.phpt
│   │   ├── cycle.phpt
│   │   ├── defer.phpt
│   │   ├── defer_with_sleep.phpt
│   │   ├── defer_without_io.phpt
│   │   ├── del.phpt
│   │   ├── del_after_close.phpt
│   │   ├── deprecated_event_wait.phpt
│   │   ├── dispatch.phpt
│   │   ├── function_alias.phpt
│   │   ├── isset.phpt
│   │   ├── kqueue.phpt
│   │   ├── rshutdown.phpt
│   │   ├── set.phpt
│   │   ├── simple.phpt
│   │   ├── sockets.phpt
│   │   ├── sync_client_1.phpt
│   │   ├── sync_client_2.phpt
│   │   ├── wait.phpt
│   │   └── write.phpt
│   ├── swoole_feature/
│   │   ├── cross_close/
│   │   │   ├── client.phpt
│   │   │   ├── client_by_server.phpt
│   │   │   ├── full_duplex.phpt
│   │   │   ├── full_duplex_by_server.phpt
│   │   │   ├── http.phpt
│   │   │   ├── http_by_server.phpt
│   │   │   ├── php_stream_full_duplex.phpt
│   │   │   ├── php_stream_full_duplex_by_server.phpt
│   │   │   ├── redis.phpt
│   │   │   ├── redis_by_server.phpt
│   │   │   ├── stream.phpt
│   │   │   └── stream_by_server.phpt
│   │   └── full_duplex/
│   │       ├── client.phpt
│   │       ├── socket.phpt
│   │       ├── socket_ssl.phpt
│   │       └── websocket.phpt
│   ├── swoole_ftp/
│   │   ├── 001.phpt
│   │   ├── 002.phpt
│   │   ├── 003.phpt
│   │   ├── 004.phpt
│   │   ├── 005.phpt
│   │   ├── 007.phpt
│   │   ├── bug27809.phpt
│   │   ├── bug37799.phpt
│   │   ├── bug39458-2.phpt
│   │   ├── bug39458.phpt
│   │   ├── bug39583-2.phpt
│   │   ├── bug39583.phpt
│   │   ├── bug7216-2.phpt
│   │   ├── bug7216.phpt
│   │   ├── bug79100.phpt
│   │   ├── bug80901.phpt
│   │   ├── cert.pem
│   │   ├── dead-resource.phpt
│   │   ├── filesize_large.phpt
│   │   ├── ftp_alloc_basic1.phpt
│   │   ├── ftp_alloc_basic2.phpt
│   │   ├── ftp_append.phpt
│   │   ├── ftp_chmod_basic.phpt
│   │   ├── ftp_connect_001.phpt
│   │   ├── ftp_constructor.phpt
│   │   ├── ftp_delete.phpt
│   │   ├── ftp_exec_basic.phpt
│   │   ├── ftp_fget_basic.phpt
│   │   ├── ftp_fget_basic1.phpt
│   │   ├── ftp_fget_basic2.phpt
│   │   ├── ftp_fget_basic3.phpt
│   │   ├── ftp_fput.phpt
│   │   ├── ftp_fput_ascii_over_4_kib.phpt
│   │   ├── ftp_get_basic.phpt
│   │   ├── ftp_get_option.phpt
│   │   ├── ftp_mdtm_basic.phpt
│   │   ├── ftp_mlsd.phpt
│   │   ├── ftp_mlsd_empty_directory.phpt
│   │   ├── ftp_mlsd_missing_directory.phpt
│   │   ├── ftp_nb_continue.phpt
│   │   ├── ftp_nb_fget_basic1.phpt
│   │   ├── ftp_nb_fget_basic2.phpt
│   │   ├── ftp_nb_fget_basic3.phpt
│   │   ├── ftp_nb_fput.phpt
│   │   ├── ftp_nb_get_large.phpt
│   │   ├── ftp_nb_put.phpt
│   │   ├── ftp_pasv.phpt
│   │   ├── ftp_rawlist_basic1.phpt
│   │   ├── ftp_rawlist_basic2.phpt
│   │   ├── ftp_rename_basic1.phpt
│   │   ├── ftp_rmdir_basic.phpt
│   │   ├── ftp_set_option.phpt
│   │   ├── ftp_set_option_errors.phpt
│   │   ├── ftp_site_basic.phpt
│   │   ├── ftp_ssl_connect_error.phpt
│   │   ├── gh10521.phpt
│   │   ├── gh10562.phpt
│   │   └── server.inc
│   ├── swoole_function/
│   │   ├── substr_json_decode.phpt
│   │   ├── substr_unserialize.phpt
│   │   ├── swoole_clear_dns_cache.phpt
│   │   ├── swoole_cpu_num.phpt
│   │   ├── swoole_error_log.phpt
│   │   ├── swoole_get_local_ip.phpt
│   │   ├── swoole_get_local_mac.phpt
│   │   ├── swoole_set_process_name.phpt
│   │   ├── swoole_strerror.phpt
│   │   └── swoole_version.phpt
│   ├── swoole_global/
│   │   ├── channel_construct_check.phpt
│   │   ├── closed_stdout.phpt
│   │   ├── create_deny.phpt
│   │   ├── function_alias.phpt
│   │   ├── serialize_deny.phpt
│   │   ├── socket_construct_check.phpt
│   │   ├── too_many_objects.phpt
│   │   ├── unset_deny.phpt
│   │   ├── unset_property_01.phpt
│   │   ├── unset_property_02.phpt
│   │   └── unset_property_03.phpt
│   ├── swoole_http2_client_coro/
│   │   ├── bug_5127.phpt
│   │   ├── connect_twice.phpt
│   │   ├── cookies.phpt
│   │   ├── error.phpt
│   │   ├── goaway.phpt
│   │   ├── headers.phpt
│   │   ├── host.phpt
│   │   ├── http_proxy.phpt
│   │   ├── huge_headers.phpt
│   │   ├── issues_2374.phpt
│   │   ├── max-frame-size.phpt
│   │   ├── multi.phpt
│   │   ├── no-gzip.phpt
│   │   ├── number.phpt
│   │   ├── ping.phpt
│   │   ├── pipeline.phpt
│   │   ├── post.phpt
│   │   ├── send-cookies.phpt
│   │   ├── send_only_bug.phpt
│   │   ├── set-cookies.phpt
│   │   ├── sock_type_unix.phpt
│   │   └── wrong_headers.phpt
│   ├── swoole_http2_server/
│   │   ├── 413.phpt
│   │   ├── big_data.phpt
│   │   ├── compression.phpt
│   │   ├── compression_types.phpt
│   │   ├── getMethod.phpt
│   │   ├── goaway.phpt
│   │   ├── http2_headers.phpt
│   │   ├── issue_4365.phpt
│   │   ├── max_concurrency.phpt
│   │   ├── nghttp2_big_data.phpt
│   │   ├── no_compression.phpt
│   │   ├── ping.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendfile_content_type.phpt
│   │   ├── sendfile_set_content_type.phpt
│   │   ├── server_addr.phpt
│   │   ├── static_handler.phpt
│   │   ├── streaming.phpt
│   │   ├── streaming_2.phpt
│   │   ├── trailer.phpt
│   │   └── worker_max_concurrency.phpt
│   ├── swoole_http2_server_coro/
│   │   └── cookies.phpt
│   ├── swoole_http_client_coro/
│   │   ├── 204.phpt
│   │   ├── addData.phpt
│   │   ├── alias.phpt
│   │   ├── another_coroutine.phpt
│   │   ├── auto_reconnect.phpt
│   │   ├── bind_address.phpt
│   │   ├── bug_2661.phpt
│   │   ├── bug_3118.phpt
│   │   ├── compression_with_big_data.phpt
│   │   ├── connect_timeout.phpt
│   │   ├── connection_close.phpt
│   │   ├── construct_failed.phpt
│   │   ├── cookies_set_bug.phpt
│   │   ├── defer.phpt
│   │   ├── defer_02.phpt
│   │   ├── disable_keep_alive.phpt
│   │   ├── download.phpt
│   │   ├── download_302.phpt
│   │   ├── download_failed.phpt
│   │   ├── download_filename_bug.phpt
│   │   ├── duplicate_header.phpt
│   │   ├── error_handler.phpt
│   │   ├── get.phpt
│   │   ├── get_header_out_after_close.phpt
│   │   ├── get_twice.phpt
│   │   ├── get_twice_keepalive.phpt
│   │   ├── get_without_content_length.phpt
│   │   ├── h2c_upgrade.phpt
│   │   ├── head_method.phpt
│   │   ├── host.phpt
│   │   ├── http_chunk.phpt
│   │   ├── http_proxy.phpt
│   │   ├── http_proxy_443.phpt
│   │   ├── http_proxy_with_host_port.phpt
│   │   ├── http_upload_big.phpt
│   │   ├── https.phpt
│   │   ├── https_upload_big.phpt
│   │   ├── issue_2664.phpt
│   │   ├── keep_alive.phpt
│   │   ├── long_domain.phpt
│   │   ├── lowercase_header.phpt
│   │   ├── multi.phpt
│   │   ├── multi_and_reuse.phpt
│   │   ├── parser.phpt
│   │   ├── post_array.phpt
│   │   ├── reconnect_but_failed.phpt
│   │   ├── recv_slow_timeout.phpt
│   │   ├── recv_timeout.phpt
│   │   ├── set_basic_auth.phpt
│   │   ├── slow_server.phpt
│   │   ├── socks5_proxy.phpt
│   │   ├── socks5_proxy_ipv6.phpt
│   │   ├── ssl.phpt
│   │   ├── ssl_host_name.phpt
│   │   ├── ssl_verify_peer_1.phpt
│   │   ├── ssl_verify_peer_2.phpt
│   │   ├── timeout_before_connect.phpt
│   │   ├── timeout_when_recv.phpt
│   │   ├── unixsocket.phpt
│   │   ├── upload.phpt
│   │   ├── upload_huge.phpt
│   │   ├── upload_with_null_args.phpt
│   │   ├── websocket/
│   │   │   ├── 1.phpt
│   │   │   ├── auto_pong.phpt
│   │   │   ├── bug_01.phpt
│   │   │   ├── bug_02.phpt
│   │   │   ├── close_socket.phpt
│   │   │   ├── continue_frame_finish_flag.phpt
│   │   │   ├── continue_frame_finish_flag2.phpt
│   │   │   ├── continue_frames.phpt
│   │   │   ├── continue_frames2.phpt
│   │   │   ├── continue_frames3.phpt
│   │   │   ├── continue_frames4.phpt
│   │   │   ├── control_frame_compress.phpt
│   │   │   ├── control_frame_fragmented.phpt
│   │   │   ├── disconnect.phpt
│   │   │   ├── open_websocket_frame.phpt
│   │   │   ├── ping.phpt
│   │   │   ├── priority.phpt
│   │   │   ├── priority1.phpt
│   │   │   ├── send_more_continue_frame.phpt
│   │   │   ├── send_more_continue_frame2.phpt
│   │   │   ├── server_push_first.phpt
│   │   │   ├── ssl_1.phpt
│   │   │   ├── ssl_2.phpt
│   │   │   ├── timeout.phpt
│   │   │   └── upgrade_after_get.phpt
│   │   ├── write_func_1.phpt
│   │   └── write_func_2.phpt
│   ├── swoole_http_server/
│   │   ├── 0.phpt
│   │   ├── 100-continue.phpt
│   │   ├── If_Modified_Since.phpt
│   │   ├── accept_encoding.phpt
│   │   ├── buffer_output_size.phpt
│   │   ├── bug_2368.phpt
│   │   ├── bug_2444.phpt
│   │   ├── bug_2608.phpt
│   │   ├── bug_2751.phpt
│   │   ├── bug_2786.phpt
│   │   ├── bug_2947.phpt
│   │   ├── bug_2988.phpt
│   │   ├── bug_4261.phpt
│   │   ├── bug_4857.phpt
│   │   ├── bug_5107.phpt
│   │   ├── bug_5114.phpt
│   │   ├── bug_5146.phpt
│   │   ├── bug_5186.phpt
│   │   ├── bug_6007.phpt
│   │   ├── bug_compression_level.phpt
│   │   ├── bug_get_request_data_after_end.phpt
│   │   ├── callback_new_obj_method.phpt
│   │   ├── callback_new_static_method.phpt
│   │   ├── callback_string.phpt
│   │   ├── callback_with_internal_function.phpt
│   │   ├── callback_with_private.phpt
│   │   ├── callback_with_protected.phpt
│   │   ├── chunk.phpt
│   │   ├── chunk_with_end_data.phpt
│   │   ├── chunked_pipeline_request.phpt
│   │   ├── client_ca.phpt
│   │   ├── client_compress.phpt
│   │   ├── co_switching.phpt
│   │   ├── compression.phpt
│   │   ├── compression_min_length.phpt
│   │   ├── compression_types.phpt
│   │   ├── cookieAlias.phpt
│   │   ├── cookie_delete.phpt
│   │   ├── cookie_samesite.phpt
│   │   ├── cookie_vs_rawcookie.phpt
│   │   ├── cookies.phpt
│   │   ├── cookies_parse.phpt
│   │   ├── create_request.phpt
│   │   ├── data_parse.phpt
│   │   ├── disable_compression.phpt
│   │   ├── disable_coroutine.phpt
│   │   ├── dispatch_mode_7.phpt
│   │   ├── duplicate_header.phpt
│   │   ├── enable_coroutine.phpt
│   │   ├── error_1203.phpt
│   │   ├── error_413.phpt
│   │   ├── event_stream.phpt
│   │   ├── event_stream2.phpt
│   │   ├── form_data_1.phpt
│   │   ├── form_data_with_charset.phpt
│   │   ├── head_method.phpt
│   │   ├── headers_sent.phpt
│   │   ├── headers_sent_coroutine.phpt
│   │   ├── http_autoindex.phpt
│   │   ├── http_index_files.phpt
│   │   ├── http_index_files_autoindex.phpt
│   │   ├── https.phpt
│   │   ├── issue_2360.phpt
│   │   ├── json_encode.phpt
│   │   ├── json_encode2.phpt
│   │   ├── large_url.phpt
│   │   ├── max-age.phpt
│   │   ├── max_concurrency.phpt
│   │   ├── max_coro_num.phpt
│   │   ├── max_execution_time.phpt
│   │   ├── max_input_vars.phpt
│   │   ├── mixed_server.phpt
│   │   ├── new_cookie.phpt
│   │   ├── no_compression.phpt
│   │   ├── numeric_header_name.phpt
│   │   ├── objectCookie.phpt
│   │   ├── objectCookieMemory.phpt
│   │   ├── octane_bug_651.phpt
│   │   ├── pipeline.phpt
│   │   ├── post.phpt
│   │   ├── purge_method.phpt
│   │   ├── range.phpt
│   │   ├── range2.phpt
│   │   ├── rawContent.phpt
│   │   ├── rawCookie.phpt
│   │   ├── redirect.phpt
│   │   ├── reset_concurrency_with_base.phpt
│   │   ├── reset_concurrency_with_process.phpt
│   │   ├── response_create.phpt
│   │   ├── send_500_to_client.phpt
│   │   ├── send_empty_file.phpt
│   │   ├── send_yield.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendfile_client_reset.phpt
│   │   ├── sendfile_dir.phpt
│   │   ├── sendfile_link.phpt
│   │   ├── sendfile_no_keepalive.phpt
│   │   ├── sendfile_with_dispatch_mode_7.phpt
│   │   ├── sendfile_with_ssl.phpt
│   │   ├── server_addr.phpt
│   │   ├── server_addr2.phpt
│   │   ├── set_content_length.phpt
│   │   ├── shutdown_in_event_worker.phpt
│   │   ├── shutdown_in_task_worker.phpt
│   │   ├── slow_client.phpt
│   │   ├── slow_large_post.phpt
│   │   ├── sni/
│   │   │   └── server.phpt
│   │   ├── static_handler/
│   │   │   ├── locations.phpt
│   │   │   ├── mimetype_not_exists.phpt
│   │   │   ├── read_link_2.phpt
│   │   │   ├── read_link_file.phpt
│   │   │   ├── relative_path.phpt
│   │   │   ├── relative_path_2.phpt
│   │   │   ├── relative_path_3.phpt
│   │   │   └── urldecode.phpt
│   │   ├── static_handler.phpt
│   │   ├── task/
│   │   │   ├── enable_coroutine.phpt
│   │   │   ├── enable_coroutine_with_wrong_usage.phpt
│   │   │   └── use_object.phpt
│   │   ├── tmp-content-type.phpt
│   │   ├── too_many_special_chars_in_cookie.phpt
│   │   ├── trailer.phpt
│   │   ├── unixsocket.phpt
│   │   ├── unixsocket2.phpt
│   │   ├── unset_response_header.phpt
│   │   ├── upload.phpt
│   │   ├── upload4.phpt
│   │   ├── uploadFile.phpt
│   │   ├── upload_02.phpt
│   │   ├── upload_03.phpt
│   │   ├── upload_big_file.phpt
│   │   ├── upload_file_array_default.phpt
│   │   ├── upload_file_array_parsed.phpt
│   │   ├── upload_file_empty.phpt
│   │   ├── upload_max_filesize.phpt
│   │   ├── url_rewrite.phpt
│   │   ├── worker_max_concurrency.phpt
│   │   └── zstd.phpt
│   ├── swoole_http_server_coro/
│   │   ├── bad_request.phpt
│   │   ├── buffer_clear.phpt
│   │   ├── bug_2682.phpt
│   │   ├── bug_3025.phpt
│   │   ├── bug_4519.phpt
│   │   ├── bug_no_handle.phpt
│   │   ├── check_cookie_crlf.phpt
│   │   ├── check_http_header_crlf.phpt
│   │   ├── chunked_pipeline_request.phpt
│   │   ├── close_socket.phpt
│   │   ├── compress_continue_frames.phpt
│   │   ├── compression_min_length.phpt
│   │   ├── compression_types.phpt
│   │   ├── continue_frames.phpt
│   │   ├── continue_frames2.phpt
│   │   ├── continue_frames3.phpt
│   │   ├── continue_frames4.phpt
│   │   ├── control_frame_compress.phpt
│   │   ├── control_frame_fragmented.phpt
│   │   ├── crash-bad-return-type.phpt
│   │   ├── create_response.phpt
│   │   ├── create_response_2.phpt
│   │   ├── disconnect.phpt
│   │   ├── error_404.phpt
│   │   ├── error_413.phpt
│   │   ├── form_data_1.phpt
│   │   ├── form_data_2.phpt
│   │   ├── graceful_shutdown.phpt
│   │   ├── handle.phpt
│   │   ├── http2.phpt
│   │   ├── http2_ssl.phpt
│   │   ├── https.phpt
│   │   ├── ipv6.phpt
│   │   ├── keepalive.phpt
│   │   ├── open_frame.phpt
│   │   ├── ping.phpt
│   │   ├── pipeline.phpt
│   │   ├── post_array.phpt
│   │   ├── random_port.phpt
│   │   ├── rawContent_get_big_data.phpt
│   │   ├── remote_addr.phpt
│   │   ├── restart.phpt
│   │   ├── reuse_port.phpt
│   │   ├── sendfile.phpt
│   │   ├── server_addr.phpt
│   │   ├── slow_client.phpt
│   │   ├── slow_large_post.phpt
│   │   ├── ssl_bad_client.phpt
│   │   ├── tcp_nodelay.phpt
│   │   ├── upload.phpt
│   │   ├── websocket.phpt
│   │   ├── websocket_close.phpt
│   │   ├── websocket_compression.phpt
│   │   ├── websocket_mixed.phpt
│   │   ├── websocket_ping.phpt
│   │   └── websocket_ping_pong.phpt
│   ├── swoole_iouring/
│   │   ├── mix.phpt
│   │   └── setting.phpt
│   ├── swoole_library/
│   │   ├── array_object/
│   │   │   └── base.phpt
│   │   ├── database/
│   │   │   ├── mysqli.phpt
│   │   │   ├── pdo.phpt
│   │   │   └── redis.phpt
│   │   ├── exec/
│   │   │   ├── exec/
│   │   │   │   ├── 1.phpt
│   │   │   │   └── 2.phpt
│   │   │   └── shell_exec/
│   │   │       └── 1.phpt
│   │   ├── multibyte_string_object/
│   │   │   └── base.phpt
│   │   ├── name_resolver/
│   │   │   ├── 1.phpt
│   │   │   └── lookup.phpt
│   │   ├── string_object/
│   │   │   └── base.phpt
│   │   └── wait_group/
│   │       ├── normal.phpt
│   │       └── timeout.phpt
│   ├── swoole_lock/
│   │   ├── bug_5984.phpt
│   │   ├── lock_nb.phpt
│   │   ├── lock_read.phpt
│   │   ├── lock_timeout.phpt
│   │   ├── mutex.phpt
│   │   └── spinlock_timeout.phpt
│   ├── swoole_pdo_firebird/
│   │   ├── base.phpt
│   │   ├── pdo_firebird.inc
│   │   ├── query.phpt
│   │   ├── sleep.phpt
│   │   └── transaction.phpt
│   ├── swoole_pdo_odbc/
│   │   ├── base.phpt
│   │   ├── blocking.phpt
│   │   ├── query.phpt
│   │   ├── race.phpt
│   │   ├── server_info.phpt
│   │   ├── sleep.phpt
│   │   └── transaction.phpt
│   ├── swoole_pdo_oracle/
│   │   ├── bug41996.phpt
│   │   ├── bug44301.phpt
│   │   ├── bug46274.phpt
│   │   ├── bug46274_2.phpt
│   │   ├── bug54379.phpt
│   │   ├── bug57702.phpt
│   │   ├── bug60994.phpt
│   │   ├── bug_33707.phpt
│   │   ├── checkliveness.phpt
│   │   ├── coroutint.phpt
│   │   ├── oci_success_with_info.phpt
│   │   ├── pdo_oci_attr_action.phpt
│   │   ├── pdo_oci_attr_autocommit_1.phpt
│   │   ├── pdo_oci_attr_autocommit_2.phpt
│   │   ├── pdo_oci_attr_autocommit_3.phpt
│   │   ├── pdo_oci_attr_call_timeout.phpt
│   │   ├── pdo_oci_attr_case.phpt
│   │   ├── pdo_oci_attr_client.phpt
│   │   ├── pdo_oci_attr_client_identifier.phpt
│   │   ├── pdo_oci_attr_client_info.phpt
│   │   ├── pdo_oci_attr_drivername.phpt
│   │   ├── pdo_oci_attr_module.phpt
│   │   ├── pdo_oci_attr_nulls_1.phpt
│   │   ├── pdo_oci_attr_prefetch_1.phpt
│   │   ├── pdo_oci_attr_prefetch_2.phpt
│   │   ├── pdo_oci_attr_server.phpt
│   │   ├── pdo_oci_class_constants.phpt
│   │   ├── pdo_oci_debugdumpparams.phpt
│   │   ├── pdo_oci_fread_1.phpt
│   │   ├── pdo_oci_phpinfo.phpt
│   │   ├── pdo_oci_quote1.phpt
│   │   ├── pdo_oci_stmt_getcolumnmeta.phpt
│   │   ├── pdo_oci_stream_1.phpt
│   │   ├── pdo_oci_stream_2.phpt
│   │   ├── pdo_oci_templob_1.phpt
│   │   ├── pdo_oracle.inc
│   │   ├── pecl_bug_11345.phpt
│   │   ├── pecl_bug_6364.phpt
│   │   ├── transcation.phpt
│   │   └── transcation2.phpt
│   ├── swoole_pdo_pgsql/
│   │   ├── base.phpt
│   │   ├── blocking.phpt
│   │   ├── bug_5635.phpt
│   │   ├── libpq_version.phpt
│   │   ├── pdo_pgsql.inc
│   │   ├── query.phpt
│   │   ├── race.phpt
│   │   ├── sleep.phpt
│   │   └── transaction.phpt
│   ├── swoole_pdo_sqlite/
│   │   ├── bug33841.phpt
│   │   ├── bug35336.phpt
│   │   ├── bug38334.phpt
│   │   ├── bug43831.phpt
│   │   ├── bug44327_2_1.phpt
│   │   ├── bug44327_2_2.phpt
│   │   ├── bug44327_3_1.phpt
│   │   ├── bug44327_3_2.phpt
│   │   ├── bug46139.phpt
│   │   ├── bug46542.phpt
│   │   ├── bug48773.phpt
│   │   ├── bug50728.phpt
│   │   ├── bug52487.phpt
│   │   ├── bug66033.phpt
│   │   ├── bug70862.phpt
│   │   ├── bug70862_1.phpt
│   │   ├── bug78192_1.phpt
│   │   ├── bug78192_2.phpt
│   │   ├── bug79664_1.phpt
│   │   ├── bug79664_2.phpt
│   │   ├── bug81740.phpt
│   │   ├── bug_42589.phpt
│   │   ├── bug_44159_sqlite_version_1.phpt
│   │   ├── bug_44159_sqlite_version_2.phpt
│   │   ├── bug_47769.phpt
│   │   ├── bug_63916-2.phpt
│   │   ├── bug_63916_1.phpt
│   │   ├── bug_63916_2.phpt
│   │   ├── bug_64705.phpt
│   │   ├── coroutine.phpt
│   │   ├── coroutine2.phpt
│   │   ├── debugdumpparams_001.phpt
│   │   ├── gh9032.phpt
│   │   ├── open_basedir.phpt
│   │   ├── pdo_035.phpt
│   │   ├── pdo_fetch_func_001.phpt
│   │   ├── pdo_fetch_func_001_1.phpt
│   │   ├── pdo_sqlite.inc
│   │   ├── pdo_sqlite_extendederror_attr.phpt
│   │   ├── pdo_sqlite_filename_uri.phpt
│   │   ├── pdo_sqlite_get_attribute.phpt
│   │   ├── pdo_sqlite_lastinsertid.phpt
│   │   ├── pdo_sqlite_open_flags.phpt
│   │   ├── pdo_sqlite_statement_getattribute.phpt
│   │   ├── pdo_sqlite_tostring_exception.phpt
│   │   └── pdo_sqlite_transaction.phpt
│   ├── swoole_process/
│   │   ├── alarm.phpt
│   │   ├── close.phpt
│   │   ├── coro/
│   │   │   ├── ipc.phpt
│   │   │   ├── set_protocol.phpt
│   │   │   ├── signal.phpt
│   │   │   └── start.phpt
│   │   ├── ctor.phpt
│   │   ├── daemon.phpt
│   │   ├── deamon.phpt
│   │   ├── echo.py
│   │   ├── enable_coroutine.phpt
│   │   ├── exception.phpt
│   │   ├── exec.phpt
│   │   ├── exit.phpt
│   │   ├── freeQueue.phpt
│   │   ├── getaffinity.phpt
│   │   ├── ignore_sigpipe.phpt
│   │   ├── ignore_sigpipe_2.phpt
│   │   ├── kill.phpt
│   │   ├── msgq_capacity.phpt
│   │   ├── name.phpt
│   │   ├── null_callback.phpt
│   │   ├── pop.phpt
│   │   ├── priority.phpt
│   │   ├── priority_error.phpt
│   │   ├── process_exec.phpt
│   │   ├── process_id.phpt
│   │   ├── process_msgqueue.phpt
│   │   ├── process_push.phpt
│   │   ├── process_select.phpt
│   │   ├── push.phpt
│   │   ├── read.phpt
│   │   ├── redirect.phpt
│   │   ├── setaffinity.phpt
│   │   ├── signal.phpt
│   │   ├── signal_in_manager.phpt
│   │   ├── signal_in_manager_2.phpt
│   │   ├── signal_in_manager_3.phpt
│   │   ├── signal_in_task_worker.phpt
│   │   ├── signal_twice.phpt
│   │   ├── start.phpt
│   │   ├── timeout.phpt
│   │   ├── useQueue.phpt
│   │   ├── wait.phpt
│   │   ├── wait_signal.phpt
│   │   ├── write.phpt
│   │   └── write_in_worker.phpt
│   ├── swoole_process_pool/
│   │   ├── bug_2652.phpt
│   │   ├── create_websocket_server.phpt
│   │   ├── detach.phpt
│   │   ├── enable_coroutine.phpt
│   │   ├── enable_coroutine2.phpt
│   │   ├── export_socket.phpt
│   │   ├── getprocess_1.phpt
│   │   ├── getprocess_2.phpt
│   │   ├── getprocess_3.phpt
│   │   ├── getprocess_4.phpt
│   │   ├── getprocess_5.phpt
│   │   ├── master_callback.phpt
│   │   ├── master_pid.phpt
│   │   ├── max_wait_time.phpt
│   │   ├── message.phpt
│   │   ├── message_async.phpt
│   │   ├── message_bus.phpt
│   │   ├── message_bus_sync.phpt
│   │   ├── msgqueue.phpt
│   │   ├── msgqueue_2.phpt
│   │   ├── reload.phpt
│   │   ├── reuse_port.phpt
│   │   ├── shutdown.phpt
│   │   ├── socket_coro.phpt
│   │   ├── start_pool_twice_in_same_process.phpt
│   │   ├── start_twice.phpt
│   │   └── worker_exit_1.phpt
│   ├── swoole_redis_server/
│   │   ├── big_packet.phpt
│   │   ├── empty.phpt
│   │   ├── format.phpt
│   │   ├── getHandler.phpt
│   │   ├── large_data_map.phpt
│   │   └── nested_map.phpt
│   ├── swoole_runtime/
│   │   ├── accept.phpt
│   │   ├── accept_timeout.phpt
│   │   ├── async_protocol.phpt
│   │   ├── base.phpt
│   │   ├── bindto.phpt
│   │   ├── bindto2.phpt
│   │   ├── block.phpt
│   │   ├── bug_4657.phpt
│   │   ├── bug_5104.phpt
│   │   ├── cancel_sleep.phpt
│   │   ├── destruct.phpt
│   │   ├── enable_crypto.phpt
│   │   ├── exec/
│   │   │   └── exec.phpt
│   │   ├── file_hook/
│   │   │   ├── a.inc
│   │   │   ├── async_file.phpt
│   │   │   ├── b.inc
│   │   │   ├── bug_4327.phpt
│   │   │   ├── bug_ftell_2g.phpt
│   │   │   ├── bug_scandir.phpt
│   │   │   ├── fgets.phpt
│   │   │   ├── flock.phpt
│   │   │   ├── fread.phpt
│   │   │   ├── include.phpt
│   │   │   ├── include_2.phpt
│   │   │   ├── lock_ex.phpt
│   │   │   ├── lock_nb_1.phpt
│   │   │   ├── lock_nb_2.phpt
│   │   │   ├── lock_sh.phpt
│   │   │   ├── open_basedir.phpt
│   │   │   ├── read.phpt
│   │   │   └── readdir.phpt
│   │   ├── file_lock/
│   │   │   ├── async_file.phpt
│   │   │   ├── lock_ex.phpt
│   │   │   ├── lock_nb.phpt
│   │   │   └── lock_sh_1.phpt
│   │   ├── ftp_fopen_wrapper.phpt
│   │   ├── get_hook_flags.phpt
│   │   ├── gethostbyname.phpt
│   │   ├── hook_default.phpt
│   │   ├── hook_enable_coroutine.phpt
│   │   ├── hook_set_flags.phpt
│   │   ├── library.phpt
│   │   ├── nonblock.phpt
│   │   ├── out_of_coroutine.phpt
│   │   ├── pdo.phpt
│   │   ├── persistent.phpt
│   │   ├── proc/
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   ├── 3.phpt
│   │   │   ├── 4.phpt
│   │   │   ├── 5.phpt
│   │   │   ├── close_after_wait.phpt
│   │   │   └── proc_open_pipes.inc
│   │   ├── redis_connect.phpt
│   │   ├── redis_pconnect.phpt
│   │   ├── remote_object/
│   │   │   └── dns.phpt
│   │   ├── sento.phpt
│   │   ├── set_hook_flags.phpt
│   │   ├── sleep.phpt
│   │   ├── sleep_yield.phpt
│   │   ├── sockets/
│   │   │   ├── basic/
│   │   │   │   ├── bug46360.phpt
│   │   │   │   ├── bug49341.phpt
│   │   │   │   ├── bug63000.phpt
│   │   │   │   ├── bug76839.phpt
│   │   │   │   ├── ipv4loop.phpt
│   │   │   │   ├── ipv6_skipif.inc
│   │   │   │   ├── ipv6loop.phpt
│   │   │   │   ├── mcast_helpers.php.inc
│   │   │   │   ├── mcast_ipv4_recv.phpt
│   │   │   │   ├── mcast_ipv4_send.phpt
│   │   │   │   ├── mcast_ipv4_send_error.phpt
│   │   │   │   ├── mcast_ipv6_recv.phpt
│   │   │   │   ├── mcast_ipv6_recv_limited.phpt
│   │   │   │   ├── mcast_ipv6_send.phpt
│   │   │   │   ├── socket_accept_failure.phpt
│   │   │   │   ├── socket_bind.phpt
│   │   │   │   ├── socket_clear_error.phpt
│   │   │   │   ├── socket_connect_params.phpt
│   │   │   │   ├── socket_create_listen-nobind.phpt
│   │   │   │   ├── socket_create_listen.phpt
│   │   │   │   ├── socket_create_listen_used.phpt
│   │   │   │   ├── socket_create_pair.phpt
│   │   │   │   ├── socket_getopt.phpt
│   │   │   │   ├── socket_getpeername.phpt
│   │   │   │   ├── socket_getpeername_ipv4loop.phpt
│   │   │   │   ├── socket_getpeername_ipv6loop.phpt
│   │   │   │   ├── socket_getsockname.phpt
│   │   │   │   ├── socket_listen-wrongparams.phpt
│   │   │   │   ├── socket_read_params.phpt
│   │   │   │   ├── socket_select-wrongparams-2.phpt
│   │   │   │   ├── socket_select.phpt
│   │   │   │   ├── socket_select_error.phpt
│   │   │   │   ├── socket_sentto_recvfrom_ipv4_udp.phpt
│   │   │   │   ├── socket_sentto_recvfrom_ipv6_udp.phpt
│   │   │   │   ├── socket_sentto_recvfrom_unix.phpt
│   │   │   │   ├── socket_set_block-retval.phpt
│   │   │   │   ├── socket_set_nonblock-retval.phpt
│   │   │   │   ├── socket_set_nonblock.phpt
│   │   │   │   ├── socket_set_option_bindtodevice.phpt
│   │   │   │   ├── socket_set_option_error_socket_option.phpt
│   │   │   │   ├── socket_set_option_in6_pktinfo.phpt
│   │   │   │   ├── socket_set_option_rcvtimeo.phpt
│   │   │   │   ├── socket_set_option_seolinger.phpt
│   │   │   │   ├── socket_set_option_sndtimeo.phpt
│   │   │   │   ├── socket_setopt_basic.phpt
│   │   │   │   ├── socket_shutdown.phpt
│   │   │   │   ├── socket_strerror.phpt
│   │   │   │   └── unixloop.phpt
│   │   │   ├── error.phpt
│   │   │   ├── get_name.phpt
│   │   │   ├── import.phpt
│   │   │   ├── nonblock.phpt
│   │   │   ├── socketpair.phpt
│   │   │   ├── tcp_client.phpt
│   │   │   ├── tcp_server.phpt
│   │   │   ├── timeout.phpt
│   │   │   └── udp.phpt
│   │   ├── ssl/
│   │   │   ├── capture_peer_cert.phpt
│   │   │   ├── client.phpt
│   │   │   ├── enable_crypto.phpt
│   │   │   ├── local_cert.phpt
│   │   │   ├── server.phpt
│   │   │   └── without_key.phpt
│   │   ├── stdin.phpt
│   │   ├── stream_context.phpt
│   │   ├── stream_context_pass_null.phpt
│   │   ├── stream_copy_to_stream_socket.phpt
│   │   ├── stream_get_meta_data.phpt
│   │   ├── stream_select/
│   │   │   ├── base.phpt
│   │   │   ├── blocked.phpt
│   │   │   ├── bug46024.phpt
│   │   │   ├── bug60120.phpt
│   │   │   ├── bug60602.phpt
│   │   │   ├── bug64438.phpt
│   │   │   ├── bug64770.phpt
│   │   │   ├── bug69521.phpt
│   │   │   ├── bug72075.phpt
│   │   │   ├── conflict.phpt
│   │   │   ├── never_timeout.phpt
│   │   │   ├── preserve_keys.phpt
│   │   │   ├── return_val.phpt
│   │   │   ├── rw_events.phpt
│   │   │   ├── stream_set_blocking.phpt
│   │   │   └── timeout.phpt
│   │   ├── stream_socket_pair.phpt
│   │   ├── tcp-c10k.phpt
│   │   ├── tcp.phpt
│   │   ├── udg.phpt
│   │   ├── udp-c10k.phpt
│   │   ├── udp.phpt
│   │   ├── unix.phpt
│   │   └── unsafe/
│   │       └── pcntl_fork.phpt
│   ├── swoole_server/
│   │   ├── accept_zero.phpt
│   │   ├── addListener.phpt
│   │   ├── addProcess.phpt
│   │   ├── addProcess_base.phpt
│   │   ├── addProcess_with_error.phpt
│   │   ├── addProcess_with_event_wait.phpt
│   │   ├── addProcess_with_tick.phpt
│   │   ├── base/
│   │   │   ├── reload_1.phpt
│   │   │   ├── reload_2.phpt
│   │   │   ├── shutdown.phpt
│   │   │   └── shutdown_single.phpt
│   │   ├── bigPipeMessage.phpt
│   │   ├── big_session_id.phpt
│   │   ├── big_udp_packet.phpt
│   │   ├── bind.phpt
│   │   ├── bug_11000_01.phpt
│   │   ├── bug_1864.phpt
│   │   ├── bug_2308.phpt
│   │   ├── bug_2313.phpt
│   │   ├── bug_2639.phpt
│   │   ├── bug_2736.phpt
│   │   ├── bug_aio.phpt
│   │   ├── check_callback.phpt
│   │   ├── check_chunk_total_size.phpt
│   │   ├── client_close_in_writable_event.phpt
│   │   ├── close_force.phpt
│   │   ├── close_in_connect_callback.phpt
│   │   ├── close_in_manager.phpt
│   │   ├── close_in_master.phpt
│   │   ├── close_in_non_current_worker.phpt
│   │   ├── close_in_other_worker_with_base.phpt
│   │   ├── close_in_task_worker.phpt
│   │   ├── close_max_fd.phpt
│   │   ├── close_queued.phpt
│   │   ├── close_reset.phpt
│   │   ├── command.phpt
│   │   ├── connections.phpt
│   │   ├── discard_timeout_packet.phpt
│   │   ├── dispatch_fallback.phpt
│   │   ├── dispatch_func.phpt
│   │   ├── dispatch_func_discard.phpt
│   │   ├── dispatch_func_memory_leak.phpt
│   │   ├── dispatch_mode_1.phpt
│   │   ├── dispatch_mode_10.phpt
│   │   ├── dispatch_mode_3.phpt
│   │   ├── dispatch_mode_7.phpt
│   │   ├── dispatch_mode_8.phpt
│   │   ├── dispatch_mode_9.phpt
│   │   ├── duplicate_registered.phpt
│   │   ├── enable_coroutine.phpt
│   │   ├── enable_delay_receive.phpt
│   │   ├── enable_reuse_port.phpt
│   │   ├── eof_protocol.phpt
│   │   ├── eof_server.phpt
│   │   ├── event/
│   │   │   ├── before_shutdown.phpt
│   │   │   ├── manager_start.phpt
│   │   │   ├── manager_stop.phpt
│   │   │   ├── shutdown.phpt
│   │   │   ├── start.phpt
│   │   │   └── worker_exit.phpt
│   │   ├── exist.phpt
│   │   ├── force_reload.phpt
│   │   ├── force_reload2.phpt
│   │   ├── force_reload3.phpt
│   │   ├── force_reload4.phpt
│   │   ├── getCallback.phpt
│   │   ├── getClientInfo.phpt
│   │   ├── getClientInfo_in_callback_of_close.phpt
│   │   ├── getClientInfo_in_callback_of_close_2.phpt
│   │   ├── getClientList.phpt
│   │   ├── getLastError.phpt
│   │   ├── getSocket.phpt
│   │   ├── getWorkerStatus.phpt
│   │   ├── heartbeat.phpt
│   │   ├── heartbeat_true.phpt
│   │   ├── heartbeat_with_base.phpt
│   │   ├── http_protocol.phpt
│   │   ├── idle_worekr_num.phpt
│   │   ├── invalid_fd.phpt
│   │   ├── invalid_option.phpt
│   │   ├── kill_user_process_01.phpt
│   │   ├── kill_user_process_02.phpt
│   │   ├── kill_worker_01.phpt
│   │   ├── kill_worker_02.phpt
│   │   ├── last_time.phpt
│   │   ├── length/
│   │   │   ├── 00.phpt
│   │   │   ├── 01.phpt
│   │   │   ├── 02.phpt
│   │   │   ├── 03.phpt
│   │   │   └── length_func.phpt
│   │   ├── listen_fail.phpt
│   │   ├── max_idle_time_1.phpt
│   │   ├── max_idle_time_2.phpt
│   │   ├── max_queued_bytes.phpt
│   │   ├── max_request.phpt
│   │   ├── max_request_grace_disabled.phpt
│   │   ├── max_request_grace_enabled.phpt
│   │   ├── max_request_threshold.phpt
│   │   ├── memory_leak/
│   │   │   ├── length.phpt
│   │   │   ├── pipe_message.phpt
│   │   │   ├── task.phpt
│   │   │   └── tcp.phpt
│   │   ├── mqtt/
│   │   │   ├── length_offset.phpt
│   │   │   ├── recv_fail.phpt
│   │   │   └── send_big_pack.phpt
│   │   ├── new_twice.phpt
│   │   ├── object/
│   │   │   ├── event.phpt
│   │   │   ├── getManagerPid.phpt
│   │   │   ├── getMasterPid.phpt
│   │   │   ├── getWorkerId.phpt
│   │   │   ├── getWorkerPid.phpt
│   │   │   ├── packet.phpt
│   │   │   ├── pipe_message.phpt
│   │   │   ├── status_info.phpt
│   │   │   └── task_result.phpt
│   │   ├── onReload.phpt
│   │   ├── parse_option_to_size.phpt
│   │   ├── pid_file.phpt
│   │   ├── protect.phpt
│   │   ├── protect_false.phpt
│   │   ├── reload.phpt
│   │   ├── reload_async.phpt
│   │   ├── reload_process.phpt
│   │   ├── sendMessage_1.phpt
│   │   ├── sendMessage_2.phpt
│   │   ├── sendMessage_3.phpt
│   │   ├── sendMessage_4.phpt
│   │   ├── sendMessage_in_manager.phpt
│   │   ├── send_2.phpt
│   │   ├── send_2m_in_task_worker.phpt
│   │   ├── send_2m_in_user_process.phpt
│   │   ├── send_3.phpt
│   │   ├── send_big_packet.phpt
│   │   ├── send_in_master.phpt
│   │   ├── send_in_other_worker_with_base.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendfile_02.phpt
│   │   ├── sendfile_ssl.phpt
│   │   ├── sendto_timeout.phpt
│   │   ├── shutdown.phpt
│   │   ├── shutdown_in_master.phpt
│   │   ├── shutdown_in_process.phpt
│   │   ├── shutdown_with_base_mode.phpt
│   │   ├── sigint_with_base.phpt
│   │   ├── sigint_with_process.phpt
│   │   ├── single_thread/
│   │   │   ├── heartbeat.phpt
│   │   │   ├── large_packet.phpt
│   │   │   └── user_setting.phpt
│   │   ├── sleep.phpt
│   │   ├── slow_client.phpt
│   │   ├── slow_master.phpt
│   │   ├── slow_worker.phpt
│   │   ├── ssl/
│   │   │   ├── 00.phpt
│   │   │   ├── bad_client.phpt
│   │   │   ├── code/
│   │   │   │   ├── client.go
│   │   │   │   └── client.js
│   │   │   ├── dtls.phpt
│   │   │   ├── dtls_big_packet.phpt
│   │   │   ├── dtls_with_length_protocol.phpt
│   │   │   ├── golang.phpt
│   │   │   ├── heartbeat_1.phpt
│   │   │   ├── heartbeat_2.phpt
│   │   │   ├── nodejs.phpt
│   │   │   ├── ssl_send_wait.phpt
│   │   │   ├── verify_01.phpt
│   │   │   ├── verify_02.phpt
│   │   │   └── verify_03.phpt
│   │   ├── start_twice.phpt
│   │   ├── stats.phpt
│   │   ├── stats_file.phpt
│   │   ├── stats_file_json.phpt
│   │   ├── stats_file_php.phpt
│   │   ├── stop.phpt
│   │   ├── stop_in_workerStart.phpt
│   │   ├── systemd_fds.phpt
│   │   ├── task/
│   │   │   ├── base.phpt
│   │   │   ├── bug_2585.phpt
│   │   │   ├── callback_is_null.phpt
│   │   │   ├── enable_coroutine.phpt
│   │   │   ├── finish_timeout.phpt
│   │   │   ├── huge_data.phpt
│   │   │   ├── idle_worekr_num.phpt
│   │   │   ├── invalid_packet.phpt
│   │   │   ├── kill_01.phpt
│   │   │   ├── kill_02.phpt
│   │   │   ├── kill_task_worker_02.phpt
│   │   │   ├── scheduler_warning.phpt
│   │   │   ├── task_callback.phpt
│   │   │   ├── task_co.phpt
│   │   │   ├── task_enable_coroutine.phpt
│   │   │   ├── task_enable_coroutine_return.phpt
│   │   │   ├── task_in_manager.phpt
│   │   │   ├── task_in_master.phpt
│   │   │   ├── task_in_task_worker.phpt
│   │   │   ├── task_in_user_process.phpt
│   │   │   ├── task_ipc_mode_2.phpt
│   │   │   ├── task_ipc_mode_3.phpt
│   │   │   ├── task_max_request.phpt
│   │   │   ├── task_pack.phpt
│   │   │   ├── task_queue.phpt
│   │   │   ├── task_wait.phpt
│   │   │   ├── timer.phpt
│   │   │   ├── unpack.phpt
│   │   │   └── without_onfinish.phpt
│   │   ├── taskWaitMulti.phpt
│   │   ├── taskwait_01.phpt
│   │   ├── taskwait_02.phpt
│   │   ├── unregistered_signal.phpt
│   │   ├── unsock_dgram.phpt
│   │   ├── unsock_stream.phpt
│   │   ├── user_process.phpt
│   │   ├── user_process_2.phpt
│   │   ├── user_process_force_exit.phpt
│   │   ├── user_process_pid.phpt
│   │   ├── wrong_eof_setting.phpt
│   │   └── z_conn_10k.phpt
│   ├── swoole_server_coro/
│   │   ├── length_1.phpt
│   │   ├── random_port.phpt
│   │   ├── reuse_port.phpt
│   │   ├── ssl.phpt
│   │   └── tcp.phpt
│   ├── swoole_server_port/
│   │   ├── connections.phpt
│   │   ├── duplicate_registered.phpt
│   │   ├── heartbeat_1.phpt
│   │   ├── heartbeat_2.phpt
│   │   ├── heartbeat_3.phpt
│   │   ├── http.phpt
│   │   ├── multi_port.phpt
│   │   ├── sub_handshake.phpt
│   │   └── tcp_eof.phpt
│   ├── swoole_socket_coro/
│   │   ├── accept.phpt
│   │   ├── all.phpt
│   │   ├── bound_error.phpt
│   │   ├── cancel.phpt
│   │   ├── check_writev_readv_param_type.phpt
│   │   ├── closed.phpt
│   │   ├── complete_test.phpt
│   │   ├── concurrency.phpt
│   │   ├── construct_parse_args_failed.phpt
│   │   ├── fd.phpt
│   │   ├── getBoundCid.phpt
│   │   ├── getopt/
│   │   │   ├── get.phpt
│   │   │   └── tcpinfo.phpt
│   │   ├── getpeername.phpt
│   │   ├── getsockname.phpt
│   │   ├── icmp.phpt
│   │   ├── import_1.phpt
│   │   ├── import_2.phpt
│   │   ├── import_3.phpt
│   │   ├── import_4.phpt
│   │   ├── import_5.phpt
│   │   ├── iov_max.phpt
│   │   ├── peek_and_checkLiveness.phpt
│   │   ├── protocol/
│   │   │   ├── bug_3586.phpt
│   │   │   └── package_length_func.phpt
│   │   ├── readVectorAll.phpt
│   │   ├── readVectorAll_ssl.phpt
│   │   ├── readVector_ssl.phpt
│   │   ├── readVector_ssl_eagain.phpt
│   │   ├── readv.phpt
│   │   ├── readv_eagain.phpt
│   │   ├── recvAll.phpt
│   │   ├── recvAll_timeout.phpt
│   │   ├── recv_bad_packet.phpt
│   │   ├── recv_line.phpt
│   │   ├── recv_timeout.phpt
│   │   ├── recv_with_buffer.phpt
│   │   ├── reuse.phpt
│   │   ├── reuse_2.phpt
│   │   ├── sendfile.phpt
│   │   ├── sendto.phpt
│   │   ├── sendto_big.phpt
│   │   ├── sendto_large_packet.phpt
│   │   ├── server_accept.phpt
│   │   ├── setopt/
│   │   │   ├── bindtodevice.phpt
│   │   │   ├── ipv6_pktinfo.phpt
│   │   │   ├── multicast.phpt
│   │   │   ├── recvtimeo.phpt
│   │   │   └── reuse.phpt
│   │   ├── shutdown.phpt
│   │   ├── ssl.phpt
│   │   ├── ssl_bad_server.phpt
│   │   ├── tcp-c10k.phpt
│   │   ├── ulimit.phpt
│   │   ├── unix_dgram.phpt
│   │   ├── unix_stream.phpt
│   │   ├── writeVectorAll.phpt
│   │   ├── writeVectorAll_ssl.phpt
│   │   ├── writeVector_ssl.phpt
│   │   ├── writeVector_ssl_eagain.phpt
│   │   ├── writev.phpt
│   │   └── writev_eagain.phpt
│   ├── swoole_ssh2/
│   │   ├── bug63480.phpt
│   │   ├── bug79631.phpt
│   │   ├── ssh2_auth.phpt
│   │   ├── ssh2_auth_pubkey.phpt
│   │   ├── ssh2_auth_pubkey_file.phpt
│   │   ├── ssh2_connect.phpt
│   │   ├── ssh2_exec.phpt
│   │   ├── ssh2_scp_recv.phpt
│   │   ├── ssh2_scp_send.phpt
│   │   ├── ssh2_send_eof.phpt
│   │   ├── ssh2_sftp_001.phpt
│   │   ├── ssh2_sftp_002.phpt
│   │   ├── ssh2_shell.phpt
│   │   ├── ssh2_skip.inc
│   │   ├── ssh2_stream_select.phpt
│   │   ├── ssh2_test.inc
│   │   ├── testkey_ed25519
│   │   └── testkey_ed25519.pub
│   ├── swoole_stdext/
│   │   ├── array_method/
│   │   │   ├── 0.phpt
│   │   │   ├── 1.phpt
│   │   │   ├── 2.phpt
│   │   │   └── method.phpt
│   │   ├── stream_method/
│   │   │   └── 0.phpt
│   │   ├── string_method/
│   │   │   ├── 0.phpt
│   │   │   ├── 1.phpt
│   │   │   ├── json.phpt
│   │   │   ├── marshal.phpt
│   │   │   ├── match.phpt
│   │   │   ├── mbstring.phpt
│   │   │   └── method.phpt
│   │   └── typed_array/
│   │       ├── 0.phpt
│   │       ├── 1.phpt
│   │       ├── 10.phpt
│   │       ├── 11.phpt
│   │       ├── 2.phpt
│   │       ├── 3.phpt
│   │       ├── 4.phpt
│   │       ├── 5.phpt
│   │       ├── 6.phpt
│   │       ├── 7.phpt
│   │       ├── 8.phpt
│   │       ├── 9.phpt
│   │       ├── array_pop.phpt
│   │       ├── array_push.phpt
│   │       ├── array_shift.phpt
│   │       ├── array_splice.phpt
│   │       ├── array_unshift.phpt
│   │       ├── resource.phpt
│   │       └── sort.phpt
│   ├── swoole_table/
│   │   ├── big_size.phpt
│   │   ├── bug_2263.phpt
│   │   ├── bug_2290.phpt
│   │   ├── create_10k_object.phpt
│   │   ├── del.phpt
│   │   ├── force_unlock.phpt
│   │   ├── foreach.phpt
│   │   ├── getMemorySize_1.phpt
│   │   ├── get_after_destroy.phpt
│   │   ├── get_before_create.phpt
│   │   ├── gh-5789.phpt
│   │   ├── incr_after_del.phpt
│   │   ├── int.phpt
│   │   ├── key_value.phpt
│   │   ├── negative.phpt
│   │   ├── random_bytes.phpt
│   │   ├── set_after_del.phpt
│   │   ├── stats.phpt
│   │   └── type_conv.phpt
│   ├── swoole_thread/
│   │   ├── add_update.phpt
│   │   ├── affinity.phpt
│   │   ├── arraylist.phpt
│   │   ├── async-io.phpt
│   │   ├── atomic_ctor.phpt
│   │   ├── barrier.phpt
│   │   ├── co-stream.phpt
│   │   ├── co-user-yield.phpt
│   │   ├── empty_args.phpt
│   │   ├── exit.phpt
│   │   ├── fatal_error_1.inc
│   │   ├── fatal_error_1.phpt
│   │   ├── fatal_error_2.inc
│   │   ├── fatal_error_2.phpt
│   │   ├── fatal_error_3.phpt
│   │   ├── incr.phpt
│   │   ├── info.phpt
│   │   ├── lock.phpt
│   │   ├── map.phpt
│   │   ├── map2array.phpt
│   │   ├── name.phpt
│   │   ├── numeric_strkey.phpt
│   │   ├── php_socket.phpt
│   │   ├── pipe.phpt
│   │   ├── priority.phpt
│   │   ├── putenv.phpt
│   │   ├── queue.phpt
│   │   ├── queue_notify_all.phpt
│   │   ├── server/
│   │   │   ├── base.phpt
│   │   │   ├── bug_5662.phpt
│   │   │   ├── bug_5694.phpt
│   │   │   ├── create_response.phpt
│   │   │   ├── exit.phpt
│   │   │   ├── fatal_error.phpt
│   │   │   ├── functions.inc
│   │   │   ├── heartbeat.phpt
│   │   │   ├── hook_flags.phpt
│   │   │   ├── listen.phpt
│   │   │   ├── manager_timer.phpt
│   │   │   ├── reload.phpt
│   │   │   ├── reload_task_workers.phpt
│   │   │   ├── reload_task_workers_async.phpt
│   │   │   ├── reset_concurrency.phpt
│   │   │   ├── send_in_user_process.phpt
│   │   │   ├── send_large_packet.phpt
│   │   │   ├── setting.phpt
│   │   │   ├── stop_worker.phpt
│   │   │   ├── taskCo.phpt
│   │   │   ├── taskWaitMulti.phpt
│   │   │   ├── udp_port.phpt
│   │   │   └── websocket.phpt
│   │   ├── shell_exec.phpt
│   │   ├── signal.phpt
│   │   ├── sort.phpt
│   │   ├── stdio.phpt
│   │   ├── stream.phpt
│   │   ├── stream_arg.phpt
│   │   ├── thread_status.phpt
│   │   └── yield.phpt
│   ├── swoole_timer/
│   │   ├── after.phpt
│   │   ├── after_fork.phpt
│   │   ├── bug_2342.phpt
│   │   ├── bug_4794.phpt
│   │   ├── bug_4794_2.phpt
│   │   ├── bug_4794_3.phpt
│   │   ├── bug_4794_4.phpt
│   │   ├── bug_4794_5.phpt
│   │   ├── bug_4794_6.phpt
│   │   ├── bug_4794_7.phpt
│   │   ├── bug_4794_8.phpt
│   │   ├── call_private.phpt
│   │   ├── callback_bug_with_array.phpt
│   │   ├── clearAll.phpt
│   │   ├── enable_coroutine.phpt
│   │   ├── enable_coroutine2.phpt
│   │   ├── function_alias.phpt
│   │   ├── greater_than_0.phpt
│   │   ├── info.phpt
│   │   ├── list.phpt
│   │   ├── manager.phpt
│   │   ├── master.phpt
│   │   ├── master_base.phpt
│   │   ├── memory.phpt
│   │   ├── next_round.phpt
│   │   ├── not_exist.phpt
│   │   ├── reinit_1.phpt
│   │   ├── reinit_2.phpt
│   │   ├── stats.phpt
│   │   ├── swoole_timer_list_alias.phpt
│   │   ├── task_worker.phpt
│   │   ├── task_worker_tick_1k.phpt
│   │   └── verify.phpt
│   ├── swoole_websocket_server/
│   │   ├── bug_1.phpt
│   │   ├── close_frame_flag.phpt
│   │   ├── close_frame_full.phpt
│   │   ├── compression.phpt
│   │   ├── disconnect.phpt
│   │   ├── disconnect_with_code.phpt
│   │   ├── dynamic_property.phpt
│   │   ├── empty_message.phpt
│   │   ├── exists_and_isEstablished.phpt
│   │   ├── fin.phpt
│   │   ├── fin2.phpt
│   │   ├── get_large_requests.phpt
│   │   ├── get_small_requests.phpt
│   │   ├── greeter.phpt
│   │   ├── header_token.phpt
│   │   ├── listener.phpt
│   │   ├── malformed_data.phpt
│   │   ├── memory.phpt
│   │   ├── message_size.phpt
│   │   ├── onDisconnct.phpt
│   │   ├── pack.phpt
│   │   ├── ping.phpt
│   │   ├── pingloop.phpt
│   │   ├── pingloop_open_ping_pong_frame.phpt
│   │   ├── pingpong.phpt
│   │   ├── pingpong_open_ping_pong_frame.phpt
│   │   ├── query.phpt
│   │   ├── recv_decode.phpt
│   │   ├── send_close_frame.phpt
│   │   ├── send_encode.phpt
│   │   ├── send_encode_async.phpt
│   │   ├── set_cookie_on_before_handshake_response.phpt
│   │   ├── set_cookie_on_handshake.phpt
│   │   └── websocket_compress_on_handshake.phpt
│   ├── template
│   └── test.sql
├── thirdparty/
│   ├── boost/
│   │   └── asm/
│   │       ├── LICENSE
│   │       ├── combined.S
│   │       ├── jump_arm64_aapcs_elf_gas.S
│   │       ├── jump_arm64_aapcs_macho_gas.S
│   │       ├── jump_combined_sysv_macho_gas.S
│   │       ├── jump_loongarch64_sysv_elf_gas.S
│   │       ├── jump_mips64_n64_elf_gas.S
│   │       ├── jump_ppc64_sysv_elf_gas.S
│   │       ├── jump_ppc64_sysv_macho_gas.S
│   │       ├── jump_ppc64_sysv_xcoff_gas.S
│   │       ├── jump_riscv64_sysv_elf_gas.S
│   │       ├── jump_sparc64_sysv_elf_gas.S
│   │       ├── jump_x86_64_sysv_elf_gas.S
│   │       ├── jump_x86_64_sysv_macho_gas.S
│   │       ├── make_arm64_aapcs_elf_gas.S
│   │       ├── make_arm64_aapcs_macho_gas.S
│   │       ├── make_combined_sysv_macho_gas.S
│   │       ├── make_loongarch64_sysv_elf_gas.S
│   │       ├── make_mips64_n64_elf_gas.S
│   │       ├── make_ppc64_sysv_elf_gas.S
│   │       ├── make_ppc64_sysv_macho_gas.S
│   │       ├── make_ppc64_sysv_xcoff_gas.S
│   │       ├── make_riscv64_sysv_elf_gas.S
│   │       ├── make_sparc64_sysv_elf_gas.S
│   │       ├── make_x86_64_sysv_elf_gas.S
│   │       └── make_x86_64_sysv_macho_gas.S
│   ├── hiredis/
│   │   ├── CHANGELOG.md
│   │   ├── COPYING
│   │   ├── README.md
│   │   ├── alloc.c
│   │   ├── alloc.h
│   │   ├── fmacros.h
│   │   ├── hiredis.c
│   │   ├── hiredis.h
│   │   ├── net.c
│   │   ├── net.h
│   │   ├── read.c
│   │   ├── read.h
│   │   ├── sds.c
│   │   ├── sds.h
│   │   └── sdsalloc.h
│   ├── llhttp/
│   │   ├── LICENSE
│   │   ├── LICENSE-MIT
│   │   ├── api.c
│   │   ├── http.c
│   │   ├── llhttp.c
│   │   └── llhttp.h
│   ├── multipart_parser.c
│   ├── multipart_parser.h
│   ├── nghttp2/
│   │   ├── COPYING
│   │   ├── LICENSE
│   │   ├── nghttp2.h
│   │   ├── nghttp2_buf.c
│   │   ├── nghttp2_buf.h
│   │   ├── nghttp2_hd.c
│   │   ├── nghttp2_hd.h
│   │   ├── nghttp2_hd_huffman.c
│   │   ├── nghttp2_hd_huffman.h
│   │   ├── nghttp2_hd_huffman_data.c
│   │   ├── nghttp2_helper.c
│   │   ├── nghttp2_mem.c
│   │   ├── nghttp2_mem.h
│   │   ├── nghttp2_rcbuf.c
│   │   ├── nghttp2_rcbuf.h
│   │   └── nghttp2ver.h
│   ├── nlohmann/
│   │   ├── LICENSE.MIT
│   │   ├── adl_serializer.hpp
│   │   ├── detail/
│   │   │   ├── conversions/
│   │   │   │   ├── from_json.hpp
│   │   │   │   ├── to_chars.hpp
│   │   │   │   └── to_json.hpp
│   │   │   ├── exceptions.hpp
│   │   │   ├── input/
│   │   │   │   ├── binary_reader.hpp
│   │   │   │   ├── input_adapters.hpp
│   │   │   │   ├── json_sax.hpp
│   │   │   │   ├── lexer.hpp
│   │   │   │   ├── parser.hpp
│   │   │   │   └── position_t.hpp
│   │   │   ├── iterators/
│   │   │   │   ├── internal_iterator.hpp
│   │   │   │   ├── iter_impl.hpp
│   │   │   │   ├── iteration_proxy.hpp
│   │   │   │   ├── iterator_traits.hpp
│   │   │   │   ├── json_reverse_iterator.hpp
│   │   │   │   └── primitive_iterator.hpp
│   │   │   ├── json_pointer.hpp
│   │   │   ├── json_ref.hpp
│   │   │   ├── macro_scope.hpp
│   │   │   ├── macro_unscope.hpp
│   │   │   ├── meta/
│   │   │   │   ├── cpp_future.hpp
│   │   │   │   ├── detected.hpp
│   │   │   │   ├── is_sax.hpp
│   │   │   │   ├── type_traits.hpp
│   │   │   │   └── void_t.hpp
│   │   │   ├── output/
│   │   │   │   ├── binary_writer.hpp
│   │   │   │   ├── output_adapters.hpp
│   │   │   │   └── serializer.hpp
│   │   │   └── value_t.hpp
│   │   ├── json.hpp
│   │   ├── json_fwd.hpp
│   │   └── thirdparty/
│   │       └── hedley/
│   │           ├── hedley.hpp
│   │           └── hedley_undef.hpp
│   ├── pdo_oci/
│   │   ├── CREDITS
│   │   ├── README.md
│   │   ├── oci_driver.c
│   │   ├── oci_statement.c
│   │   ├── pdo_oci.c
│   │   └── php_pdo_oci_int.h
│   ├── pdo_sqlite/
│   │   ├── php_pdo_sqlite.h
│   │   ├── php_pdo_sqlite_int.h
│   │   ├── sqlite_driver.c
│   │   ├── sqlite_sql_parser.c
│   │   └── sqlite_statement.c
│   ├── php/
│   │   ├── LICENSE
│   │   ├── curl/
│   │   │   ├── curl_arginfo.h
│   │   │   ├── curl_private.h
│   │   │   ├── interface.cc
│   │   │   ├── multi.cc
│   │   │   └── php_curl.h
│   │   ├── main/
│   │   │   └── SAPI.h
│   │   ├── sockets/
│   │   │   ├── conversions.cc
│   │   │   ├── conversions.h
│   │   │   ├── multicast.cc
│   │   │   ├── multicast.h
│   │   │   ├── php_sockets_cxx.h
│   │   │   ├── sendrecvmsg.cc
│   │   │   └── sockaddr_conv.cc
│   │   ├── ssh2/
│   │   │   ├── LICENSE
│   │   │   ├── php_ssh2.h
│   │   │   ├── ssh2.cc
│   │   │   ├── ssh2_fopen_wrappers.cc
│   │   │   └── ssh2_sftp.cc
│   │   ├── standard/
│   │   │   ├── proc_open.cc
│   │   │   ├── proc_open.h
│   │   │   └── var_decoder.cc
│   │   ├── streams/
│   │   │   ├── php_streams_int.h
│   │   │   └── plain_wrapper.c
│   │   └── zend/
│   │       └── zend_execute.c
│   ├── php82/
│   │   ├── pdo_odbc/
│   │   │   ├── odbc_driver.c
│   │   │   ├── odbc_stmt.c
│   │   │   └── php_pdo_odbc_int.h
│   │   └── pdo_pgsql/
│   │       ├── pgsql_driver.c
│   │       ├── pgsql_driver_arginfo.h
│   │       ├── pgsql_statement.c
│   │       └── php_pdo_pgsql_int.h
│   ├── php83/
│   │   ├── pdo_odbc/
│   │   │   ├── odbc_driver.c
│   │   │   ├── odbc_stmt.c
│   │   │   └── php_pdo_odbc_int.h
│   │   └── pdo_pgsql/
│   │       ├── pgsql_driver.c
│   │       ├── pgsql_driver_arginfo.h
│   │       ├── pgsql_statement.c
│   │       └── php_pdo_pgsql_int.h
│   ├── php84/
│   │   ├── curl/
│   │   │   ├── curl_arginfo.h
│   │   │   ├── curl_private.h
│   │   │   ├── interface.cc
│   │   │   ├── multi.cc
│   │   │   └── php_curl.h
│   │   ├── ftp/
│   │   │   ├── CREDITS
│   │   │   ├── ftp.c
│   │   │   ├── ftp.h
│   │   │   ├── php_ftp.c
│   │   │   └── php_ftp.h
│   │   ├── pdo_firebird/
│   │   │   ├── CREDITS
│   │   │   ├── firebird_driver.c
│   │   │   ├── firebird_statement.c
│   │   │   ├── pdo_firebird_utils.cpp
│   │   │   ├── pdo_firebird_utils.h
│   │   │   └── php_pdo_firebird_int.h
│   │   ├── pdo_odbc/
│   │   │   ├── odbc_driver.c
│   │   │   ├── odbc_stmt.c
│   │   │   └── php_pdo_odbc_int.h
│   │   └── pdo_pgsql/
│   │       ├── pgsql_driver.c
│   │       ├── pgsql_driver_arginfo.h
│   │       ├── pgsql_sql_parser.c
│   │       ├── pgsql_statement.c
│   │       └── php_pdo_pgsql_int.h
│   └── php85/
│       ├── pdo_firebird/
│       │   ├── CREDITS
│       │   ├── firebird_driver.c
│       │   ├── firebird_statement.c
│       │   ├── pdo_firebird_utils.cpp
│       │   ├── pdo_firebird_utils.h
│       │   └── php_pdo_firebird_int.h
│       ├── pdo_odbc/
│       │   ├── odbc_driver.c
│       │   ├── odbc_stmt.c
│       │   ├── php_pdo_odbc.h
│       │   └── php_pdo_odbc_int.h
│       └── pdo_pgsql/
│           ├── pdo_pgsql_arginfo.h
│           ├── pgsql_driver.c
│           ├── pgsql_driver_arginfo.h
│           ├── pgsql_sql_parser.c
│           ├── pgsql_statement.c
│           ├── php_pdo_pgsql.h
│           └── php_pdo_pgsql_int.h
└── tools/
    ├── analysis.php
    ├── arginfo-check.php
    ├── bootstrap.php
    ├── build-library.php
    ├── code-generator.php
    ├── composer.json
    ├── constant-generator.php
    ├── export.php
    ├── gen-data.php
    ├── gen-ext-class.php
    ├── get-ip-info.php
    ├── next-version.php
    ├── option-generator.php
    ├── pecl-package.php
    ├── phpt-fixer.php
    ├── rename.php
    ├── send-http-data.php
    ├── show-big-files.php
    └── templates/
        ├── class.c
        └── version.tpl.h
Download .txt
Showing preview only (643K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7256 symbols across 569 files)

FILE: core-tests/fuzz/src/main.cpp
  function main (line 10) | int main(int argc, char * argv[])

FILE: core-tests/include/httplib_client.h
  function namespace (line 235) | namespace httplib {
  type Response (line 257) | struct Response
  type WebSocketFrame (line 258) | struct WebSocketFrame
  type MultipartFormData (line 262) | struct MultipartFormData {
  function class (line 271) | class DataSink {
  type Request (line 314) | struct Request {
  type Response (line 362) | struct Response {
  type WebSocketFrame (line 401) | struct WebSocketFrame
  function class (line 410) | class Stream {
  function Get (line 748) | inline void Get(std::vector<Request> &requests, const char *path, const ...
  function Get (line 756) | inline void Get(std::vector<Request> &requests, const char *path) {
  function Post (line 760) | inline void Post(std::vector<Request> &requests,
  function Post (line 776) | inline void Post(std::vector<Request> &requests, const char *path, const...
  function Post (line 780) | inline void Post(std::vector<Request> &requests,
  function class (line 799) | class Client2 {
  function send (line 1028) | bool send(const Request &req, Response &res) {
  function is_socket_open (line 1032) | bool is_socket_open() {
  function stop (line 1036) | void stop() {
  function set_tcp_nodelay (line 1040) | void set_tcp_nodelay(bool on) {
  function set_socket_options (line 1044) | void set_socket_options(SocketOptions socket_options) {
  function SSL_CTX (line 1147) | SSL_CTX *ssl_context() const {
  function namespace (line 1168) | namespace detail {
  function close_socket (line 1439) | inline int close_socket(socket_t sock) {
  function select_read (line 1460) | inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) {
  function select_write (line 1482) | inline ssize_t select_write(socket_t sock, time_t sec, time_t usec) {
  function wait_until_socket_is_ready (line 1504) | inline bool wait_until_socket_is_ready(socket_t sock, time_t sec, time_t...
  function class (line 1544) | class SocketStream : public Stream {
  function parse_header (line 2162) | inline void parse_header(const char *beg, const char *end, Headers &head...
  function read_headers (line 2183) | inline bool read_headers(Stream &strm, Headers &headers) {
  function read_content_with_length (line 2215) | inline bool read_content_with_length(Stream &strm, uint64_t len, Progres...
  function skip_content_with_length (line 2242) | inline void skip_content_with_length(Stream &strm, uint64_t len) {
  function read_content_without_length (line 2255) | inline bool read_content_without_length(Stream &strm, ContentReceiver ou...
  function read_content_chunked (line 2272) | inline bool read_content_chunked(Stream &strm, ContentReceiver out) {
  function is_chunked_transfer_encoding (line 2324) | inline bool is_chunked_transfer_encoding(const Headers &headers) {
  function ContentReceiver (line 2336) | ContentReceiver out = [&](const char *buf, size_t n) { return receiver(b...
  function class (line 2687) | class MultipartFormDataParser {
  function std (line 2874) | inline std::string to_lower(const char *beg, const char *end) {
  function std (line 2884) | inline std::string make_multipart_data_boundary() {
  function std (line 2920) | inline std::string make_content_range_header_field(size_t offset, size_t...
  function std (line 2969) | inline std::string make_multipart_ranges_data(const Request &req,
  function get_multipart_ranges_data_length (line 2990) | inline size_t get_multipart_ranges_data_length(const Request &req,
  function get_range_offset_and_length (line 3030) | size_t> get_range_offset_and_length(const Request &req, const Response &...
  function expect_content (line 3040) | inline bool expect_content(const Request &req) {
  function has_crlf (line 3049) | inline bool has_crlf(const char *s) {
  function parse_www_authenticate (line 3190) | inline bool parse_www_authenticate(const Response &res, std::map<std::st...
  function std (line 3219) | inline std::string random_string(size_t length) {
  function has_header (line 3233) | inline bool Request::has_header(const char *key) const {
  function get_header_value_count (line 3241) | inline size_t Request::get_header_value_count(const char *key) const {
  function set_header (line 3246) | inline void Request::set_header(const char *key, const char *val) {
  function set_header (line 3252) | inline void Request::set_header(const char *key, const std::string &val) {
  function has_param (line 3258) | inline bool Request::has_param(const char *key) const {
  function get_param_value_count (line 3272) | inline size_t Request::get_param_value_count(const char *key) const {
  function is_multipart_form_data (line 3277) | inline bool Request::is_multipart_form_data() const {
  function MultipartFormData (line 3286) | inline MultipartFormData Request::get_file_value(const char *key) const {
  function has_header (line 3295) | inline bool Response::has_header(const char *key) const {
  function get_header_value_count (line 3303) | inline size_t Response::get_header_value_count(const char *key) const {
  function set_header (line 3308) | inline void Response::set_header(const char *key, const char *val) {
  function set_header (line 3314) | inline void Response::set_header(const char *key, const std::string &val) {
  function set_redirect (line 3320) | inline void Response::set_redirect(const char *url, int stat) {
  function set_content (line 3331) | inline void Response::set_content(const char *s, size_t n, const char *c...
  function set_content (line 3336) | inline void Response::set_content(std::string s, const char *content_typ...
  function set_content_provider (line 3341) | inline void Response::set_content_provider(size_t in_length,
  function set_chunked_content_provider (line 3352) | inline void Response::set_chunked_content_provider(ChunkedContentProvide...
  function write (line 3360) | inline ssize_t Stream::write(const char *ptr) {
  function write (line 3364) | inline ssize_t Stream::write(const std::string &s) {
  function namespace (line 3401) | namespace detail {
  function read (line 3425) | inline ssize_t SocketStream::read(char *ptr, size_t size) {
  function write (line 3440) | inline ssize_t SocketStream::write(const char *ptr, size_t size) {
  function get_remote_ip_and_port (line 3455) | inline void SocketStream::get_remote_ip_and_port(std::string &ip, int &p...
  function read (line 3468) | inline ssize_t BufferStream::read(char *ptr, size_t size) {
  function write (line 3478) | inline ssize_t BufferStream::write(const char *ptr, size_t size) {
  function get_remote_ip_and_port (line 3483) | inline void BufferStream::get_remote_ip_and_port(std::string & /*ip*/, i...
  function namespace (line 3495) | namespace detail {
  function is_writable (line 3613) | inline bool SSLSocketStream::is_writable() const {
  function write (line 3624) | inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
  function get_remote_ip_and_port (line 3631) | inline void SSLSocketStream::get_remote_ip_and_port(std::string &ip, int...
  function class (line 3639) | class SSLClient : public Client {

FILE: core-tests/include/httplib_server.h
  function namespace (line 19) | namespace httplib {
  function class (line 41) | class Server {
  function routing (line 770) | inline bool Server::routing(Request &req, Response &res, Stream &strm) {
  function dispatch_request (line 832) | inline bool Server::dispatch_request(Request &req, Response &res, Handle...

FILE: core-tests/include/redis_client.h
  function namespace (line 11) | namespace swoole {

FILE: core-tests/include/test_core.h
  function namespace (line 89) | namespace swoole {

FILE: core-tests/include/test_coroutine.h
  function namespace (line 11) | namespace swoole {

FILE: core-tests/include/test_process.h
  function namespace (line 10) | namespace swoole { namespace test {

FILE: core-tests/include/test_server.h
  function namespace (line 13) | namespace swoole {

FILE: core-tests/js/ws_1.js
  function delay (line 8) | function delay(ms) {

FILE: core-tests/js/ws_2.js
  function delay (line 8) | function delay(ms) {

FILE: core-tests/samples/src/s1.cc
  type A (line 13) | struct A {
  function main (line 20) | int main(int argc, char **argv) {

FILE: core-tests/src/_lib/http.cpp
  type httplib (line 10) | namespace httplib {
    function socket_t (line 139) | socket_t Client::create_client_socket() const {

FILE: core-tests/src/_lib/process.cpp
  function pid_t (line 24) | pid_t Process::start() {

FILE: core-tests/src/_lib/redis.cpp
  type swoole (line 8) | namespace swoole {
    type timeval (line 9) | struct timeval
    function string (line 26) | string RedisClient::Get(const string &key) {
    function RedisReply (line 87) | RedisReply RedisClient::Request(int argc, const char **argv, const siz...
    function RedisReply (line 91) | RedisReply RedisClient::Request(const vector<string> &args) {

FILE: core-tests/src/_lib/server.cpp
  type swSocketType (line 117) | enum swSocketType

FILE: core-tests/src/_lib/ssl.cpp
  type swoole (line 3) | namespace swoole {
    type test (line 4) | namespace test {
      function printAllSubjectEntries (line 5) | void printAllSubjectEntries(X509_NAME *name) {
      function printX509Info (line 29) | void printX509Info(X509 *cert) {
      function dump_cert_info (line 68) | int dump_cert_info(const char *data, size_t len) {

FILE: core-tests/src/core/base.cpp
  function TEST (line 36) | TEST(base, datahead_dump) {
  function TEST (line 46) | TEST(base, dec2hex) {
  function TEST (line 52) | TEST(base, hex2dec) {
  function TEST (line 62) | TEST(base, random_string) {
  function test_sw_vsnprintf (line 68) | static size_t test_sw_vsnprintf(char *buf, size_t size, const char *form...
  function TEST (line 76) | TEST(base, file_put_contents) {
  function TEST (line 84) | TEST(base, file_get_size) {
  function TEST (line 98) | TEST(base, version_compare) {
  function TEST (line 105) | TEST(base, common_divisor) {
  function TEST (line 111) | TEST(base, common_multiple) {
  function TEST (line 117) | TEST(base, shell_exec) {
  function TEST (line 147) | TEST(base, file_size) {
  function TEST (line 157) | TEST(base, eventdata_pack) {
  function TEST (line 173) | TEST(base, stack_defer_fn) {
  function TEST (line 187) | TEST(base, string_format) {
  function TEST (line 193) | TEST(base, dirname) {
  function TEST (line 200) | TEST(base, mkdir_recursive) {
  function TEST (line 206) | TEST(base, set_task_tmpdir) {
  function TEST (line 250) | TEST(base, version) {
  function TEST (line 256) | TEST(base, hook) {
  function TEST (line 270) | TEST(base, intersection) {
  function TEST (line 280) | TEST(base, itoa) {
  function TEST (line 289) | TEST(base, get_systemd_listen_fds) {
  function TEST (line 297) | TEST(base, type_size) {
  function swoole_fatal_error_impl (line 306) | size_t swoole_fatal_error_impl(const char *format, ...) {
  function TEST (line 317) | TEST(base, vsnprintf) {
  function TEST (line 336) | TEST(base, snprintf) {
  function TEST (line 353) | TEST(base, log_level) {
  function TEST (line 361) | TEST(base, trace_flag) {
  function TEST (line 368) | TEST(base, only_dump) {
  function TEST (line 377) | TEST(base, redirect_stdout) {
  function TEST (line 403) | TEST(base, fatal_error) {
  function TEST (line 418) | TEST(base, spinlock) {
  function TEST (line 443) | TEST(base, futex) {
  function test_fork_fail (line 476) | static int test_fork_fail(const std::function<void(void)> &after_fork_fa...
  function TEST (line 540) | TEST(base, fork_fail) {
  function TEST (line 558) | TEST(base, undefined_behavior) {

FILE: core-tests/src/core/channel.cpp
  function TEST (line 28) | TEST(channel, push) {
  function TEST (line 90) | TEST(channel, peek) {
  function TEST (line 101) | TEST(channel, notify) {

FILE: core-tests/src/core/hash.cpp
  function TEST (line 27) | TEST(hash, crc32) {
  function test_hash_func (line 31) | static void test_hash_func(uint64_t (*hash_fn)(const char *key, size_t l...
  function TEST (line 53) | TEST(hash, php) {
  function TEST (line 57) | TEST(hash, jenkins) {
  function TEST (line 61) | TEST(hash, austin) {

FILE: core-tests/src/core/heap.cpp
  type node_t (line 5) | struct node_t {
  function TEST (line 12) | TEST(heap, random) {

FILE: core-tests/src/core/log.cpp
  function TEST (line 11) | TEST(log, level) {
  function TEST (line 59) | TEST(log, date_format) {
  function TEST (line 88) | TEST(log, date_format_long_string) {
  function TEST (line 103) | TEST(log, date_with_microseconds) {
  function TEST (line 118) | TEST(log, rotation) {
  function TEST (line 142) | TEST(log, redirect_1) {
  function TEST (line 166) | TEST(log, redirect_2) {
  type TestA (line 191) | namespace TestA {
    class TestPrettyName (line 192) | class TestPrettyName {
    function test_pretty_name (line 201) | static void test_pretty_name(bool strip, const char *expect_str) {
    function test_pretty_name_lambda (line 205) | static void test_pretty_name_lambda(bool strip, const char *expect_str) {
  function test_pretty_name (line 214) | static void test_pretty_name(bool strip, const char *expect_str) {
  function test_pretty_name_lambda (line 218) | static void test_pretty_name_lambda(bool strip, const char *expect_str) {
  function TEST (line 225) | TEST(log, pretty_name) {
  function TEST (line 235) | TEST(log, pretty_name_lambda) {
  function TEST (line 243) | TEST(log, ignore_error) {
  function TEST (line 265) | TEST(log, open_fail) {
  function TEST (line 272) | TEST(log, set_stream) {

FILE: core-tests/src/core/string.cpp
  function TEST (line 7) | TEST(string, ltrim) {
  function TEST (line 32) | TEST(string, rtrim) {
  function TEST (line 48) | TEST(string, move_and_copy) {
  function TEST (line 74) | TEST(string, append) {
  function TEST (line 84) | TEST(string, write) {
  function TEST (line 96) | TEST(string, repeat) {
  function TEST (line 115) | TEST(string, release) {
  function TEST (line 127) | TEST(string, ub) {
  function TEST (line 138) | TEST(string, strnpos) {
  function TEST (line 157) | TEST(string, strnstr) {
  function TEST (line 178) | TEST(string, explode) {
  function TEST (line 203) | TEST(string, explode_2) {
  function TEST (line 232) | TEST(string, pop_1) {
  function TEST (line 251) | TEST(string, pop_2) {
  function TEST (line 270) | TEST(string, reduce_1) {
  function TEST (line 283) | TEST(string, reduce_2) {
  function TEST (line 295) | TEST(string, reduce_3) {
  function TEST (line 310) | TEST(string, format_1) {
  function TEST (line 321) | TEST(string, format_2) {
  function TEST (line 333) | TEST(string, substr_len) {
  function TEST (line 339) | TEST(string, starts_with) {
  function TEST (line 346) | TEST(string, ends_with) {
  function TEST (line 353) | TEST(string, append_number) {

FILE: core-tests/src/core/time.cpp
  function TEST (line 4) | TEST(time, get_ms) {
  function TEST (line 12) | TEST(time, get_ms_steady) {
  function TEST (line 20) | TEST(time, get_seconds) {
  function TEST (line 26) | TEST(time, get_timezone) {

FILE: core-tests/src/core/util.cpp
  function TEST (line 24) | TEST(util, bitmap) {

FILE: core-tests/src/coroutine/accept.cpp
  function TEST (line 27) | TEST(coroutine_hook, accept) {

FILE: core-tests/src/coroutine/async.cpp
  function TEST (line 13) | TEST(coroutine_async, usleep) {
  function TEST (line 27) | TEST(coroutine_async, gethostbyname) {
  function TEST (line 53) | TEST(coroutine_async, error) {
  function TEST (line 63) | TEST(coroutine_async, cancel) {
  function TEST (line 82) | TEST(coroutine_async, timeout) {

FILE: core-tests/src/coroutine/base.cpp
  function TEST (line 6) | TEST(coroutine_base, create) {
  function TEST (line 14) | TEST(coroutine_base, get_current) {
  function TEST (line 27) | TEST(coroutine_base, get_init_msec) {
  function TEST (line 36) | TEST(coroutine_base, yield_resume) {
  function TEST (line 71) | TEST(coroutine_base, get_cid) {
  function TEST (line 80) | TEST(coroutine_base, get_origin) {
  function TEST (line 95) | TEST(coroutine_base, get_origin_cid) {
  function TEST (line 109) | TEST(coroutine_base, is_end) {
  function TEST (line 116) | TEST(coroutine_base, set_task) {
  function TEST (line 126) | TEST(coroutine_base, get_current_task) {
  function TEST (line 136) | TEST(coroutine_base, get_current_cid) {
  function TEST (line 145) | TEST(coroutine_base, get_by_cid) {
  function TEST (line 153) | TEST(coroutine_base, get_task_by_cid) {
  function TEST (line 163) | TEST(coroutine_base, get_last_cid) {
  function TEST (line 171) | TEST(coroutine_base, count) {
  function TEST (line 179) | TEST(coroutine_base, get_peak_num) {
  function TEST (line 184) | TEST(coroutine_base, get_elapsed) {
  function TEST (line 196) | TEST(coroutine_base, run) {
  function TEST (line 203) | TEST(coroutine_base, cancel) {
  function TEST (line 215) | TEST(coroutine_base, noncancelable) {
  function TEST (line 253) | TEST(coroutine_base, timeout) {
  function TEST (line 261) | TEST(coroutine_base, gdb) {
  function TEST (line 279) | TEST(coroutine_base, bailout) {
  function TEST (line 330) | TEST(coroutine_base, undefined_behavior) {
  function TEST (line 352) | TEST(coroutine_base, c_api) {

FILE: core-tests/src/coroutine/channel.cpp
  function TEST (line 9) | TEST(coroutine_channel, push_pop) {
  function TEST (line 21) | TEST(coroutine_channel, push_yield) {
  function TEST (line 46) | TEST(coroutine_channel, pop_yield) {
  function TEST (line 72) | TEST(coroutine_channel, push_timeout) {
  function TEST (line 84) | TEST(coroutine_channel, pop_timeout) {
  function TEST (line 94) | TEST(coroutine_channel, close) {
  function TEST (line 130) | TEST(coroutine_channel, cancel) {

FILE: core-tests/src/coroutine/file.cpp
  function TEST (line 26) | TEST(coroutine_async_file, async_file) {

FILE: core-tests/src/coroutine/gethostbyname.cpp
  function TEST (line 8) | TEST(coroutine_gethostbyname, resolve_cache) {
  function TEST (line 28) | TEST(coroutine_gethostbyname, impl_async) {
  function TEST (line 35) | TEST(coroutine_gethostbyname, resolve_cache_inet4_and_inet6) {
  function TEST (line 61) | TEST(coroutine_gethostbyname, dns_expire) {

FILE: core-tests/src/coroutine/hook.cpp
  function test_file_hook (line 36) | void static test_file_hook() {
  function TEST (line 93) | TEST(coroutine_hook, file) {
  function TEST (line 99) | TEST(coroutine_hook, gethostbyname) {
  function TEST (line 110) | TEST(coroutine_hook, getaddrinfo) {
  function test_fstat (line 142) | static void test_fstat() {
  function TEST (line 155) | TEST(coroutine_hook, fstat) {
  function test_statvfs (line 160) | static void test_statvfs() {
  function TEST (line 170) | TEST(coroutine_hook, statvfs) {
  function test_hook_dir (line 175) | static void test_hook_dir() {
  function TEST (line 182) | TEST(coroutine_hook, dir) {
  function test_hook_socket (line 188) | static void test_hook_socket() {
  function TEST (line 218) | TEST(coroutine_hook, socket) {
  function TEST (line 224) | TEST(coroutine_hook, rename) {
  function TEST (line 243) | TEST(coroutine_hook, flock) {
  function TEST (line 281) | TEST(coroutine_hook, read_dir) {
  function TEST (line 307) | TEST(coroutine_hook, readlink) {
  function TEST (line 323) | TEST(coroutine_hook, stdio_1) {
  function TEST (line 345) | TEST(coroutine_hook, stdio_2) {
  function TEST (line 376) | TEST(coroutine_hook, sleep) {
  function TEST (line 393) | TEST(coroutine_hook, exists) {
  function TEST (line 404) | TEST(coroutine_hook, timeout) {
  function TEST (line 443) | TEST(coroutine_hook, sendmsg_and_recvmsg) {
  function TEST (line 493) | TEST(coroutine_hook, lseek) {
  function TEST (line 501) | TEST(coroutine_hook, socket_close) {
  function TEST (line 548) | TEST(coroutine_hook, poll) {
  function TEST (line 625) | TEST(coroutine_hook, poll_fake) {
  function TEST (line 679) | TEST(coroutine_hook, unwrap) {
  function test_freopen (line 702) | static void test_freopen() {
  function TEST (line 731) | TEST(coroutine_hook, freopen) {
  function TEST (line 736) | TEST(coroutine_hook, ftruncate) {
  function TEST (line 750) | TEST(coroutine_hook, get_socket_fail) {
  function TEST (line 771) | TEST(coroutine_hook, create_socket_fail) {

FILE: core-tests/src/coroutine/http_server.cpp
  function TEST (line 27) | TEST(coroutine_http_server, get) {
  function TEST (line 63) | TEST(coroutine_http_server, post) {

FILE: core-tests/src/coroutine/iouring.cpp
  function TEST (line 30) | TEST(iouring, create) {
  function TEST (line 40) | TEST(iouring, list_all_opcode) {
  function TEST (line 48) | TEST(iouring, open_and_close) {
  function TEST (line 62) | TEST(iouring, mkdir_and_rmdir) {
  function TEST (line 75) | TEST(iouring, write_and_read) {
  function TEST (line 104) | TEST(iouring, rename) {
  function TEST (line 123) | TEST(iouring, fstat_and_stat) {
  function TEST (line 146) | TEST(iouring, fsync_and_fdatasync) {
  function TEST (line 175) | TEST(iouring, ftruncate) {
  function TEST (line 194) | TEST(iouring, connect) {
  function TEST (line 222) | TEST(iouring, send_recv) {
  function TEST (line 249) | TEST(iouring, sendfile) {
  function uring_create_server_socket (line 271) | static int uring_create_server_socket(struct sockaddr_in *actual_server_...
  function TEST (line 296) | TEST(iouring, accept) {
  function TEST (line 344) | TEST(iouring, sleep) {
  function TEST (line 362) | TEST(iouring, wait_success) {
  function TEST (line 372) | TEST(iouring, wait_timeout) {
  function TEST (line 385) | TEST(iouring, waitpid) {
  function TEST (line 400) | TEST(iouring, poll) {
  function TEST (line 454) | TEST(iouring, accept_timeout) {

FILE: core-tests/src/coroutine/socket.cpp
  function TEST (line 41) | TEST(coroutine_socket, connect_refused) {
  function TEST (line 50) | TEST(coroutine_socket, connect_timeout) {
  function TEST (line 72) | TEST(coroutine_socket, timeout_controller) {
  function TEST (line 109) | TEST(coroutine_socket, timeout_setter) {
  function TEST (line 142) | TEST(coroutine_socket, connect_with_dns) {
  function TEST (line 151) | TEST(coroutine_socket, tcp6) {
  function TEST (line 160) | TEST(coroutine_socket, unixsock_fail) {
  function TEST (line 169) | TEST(coroutine_socket, recv_success) {
  function TEST (line 203) | TEST(coroutine_socket, recv_fail) {
  function TEST (line 236) | TEST(coroutine_socket, bind_success) {
  function TEST (line 249) | TEST(coroutine_socket, bind_fail) {
  function TEST (line 262) | TEST(coroutine_socket, listen) {
  function TEST (line 272) | TEST(coroutine_socket, accept) {
  function socket_set_eof_protocol (line 294) | static void socket_set_eof_protocol(Socket &sock) {
  function TEST (line 300) | TEST(coroutine_socket, eof_1) {
  function TEST (line 335) | TEST(coroutine_socket, eof_2) {
  function TEST (line 383) | TEST(coroutine_socket, eof_3) {
  function TEST (line 412) | TEST(coroutine_socket, eof_4) {
  function TEST (line 445) | TEST(coroutine_socket, eof_5) {
  function TEST (line 482) | TEST(coroutine_socket, eof_6) {
  function socket_set_length_protocol_1 (line 518) | static void socket_set_length_protocol_1(Socket &sock) {
  function socket_set_length_protocol_2 (line 530) | static void socket_set_length_protocol_2(Socket &sock) {
  function TEST (line 542) | TEST(coroutine_socket, length_1) {
  function TEST (line 575) | TEST(coroutine_socket, length_2) {
  function TEST (line 607) | TEST(coroutine_socket, length_3) {
  function length_protocol_server_func (line 641) | static void length_protocol_server_func(void *arg, int port) {
  function TEST (line 669) | TEST(coroutine_socket, length_4) {
  function TEST (line 702) | TEST(coroutine_socket, length_5) {
  function TEST (line 732) | TEST(coroutine_socket, length_7) {
  function TEST (line 766) | TEST(coroutine_socket, event_hup) {
  function TEST (line 799) | TEST(coroutine_socket, recv_line) {
  function TEST (line 851) | TEST(coroutine_socket, getsockname) {
  function TEST (line 860) | TEST(coroutine_socket, buffer) {
  function TEST (line 881) | TEST(coroutine_socket, check_liveness) {
  function TEST (line 895) | TEST(coroutine_socket, write_and_read) {
  function TEST (line 919) | TEST(coroutine_socket, write_and_read_2) {
  function TEST (line 944) | TEST(coroutine_socket, writev_and_readv) {
  function TEST (line 986) | TEST(coroutine_socket, send_and_recv_all) {
  function TEST (line 1017) | TEST(coroutine_socket, writevall_and_readvall) {
  function TEST (line 1072) | TEST(coroutine_socket, sendfile) {
  function test_sendto_recvfrom (line 1093) | static void test_sendto_recvfrom(enum swSocketType sock_type) {
  function TEST (line 1142) | TEST(coroutine_socket, sendto_recvfrom_udp) {
  function socket_test_request_baidu (line 1147) | static void socket_test_request_baidu(Socket &sock) {
  function proxy_test (line 1162) | static void proxy_test(Socket &sock, bool https) {
  function proxy_set_socks5_proxy (line 1180) | static void proxy_set_socks5_proxy(Socket &socket, int port, bool auth) {
  function TEST (line 1189) | TEST(coroutine_socket, https_get_with_socks5_proxy) {
  function TEST (line 1205) | TEST(coroutine_socket, http_get_with_socks5_proxy) {
  function proxy_set_http_proxy (line 1221) | static void proxy_set_http_proxy(Socket &socket) {
  function TEST (line 1230) | TEST(coroutine_socket, http_get_with_http_proxy) {
  function TEST (line 1238) | TEST(coroutine_socket, https_get_with_http_proxy) {
  function TEST (line 1246) | TEST(coroutine_socket, ssl) {
  function TEST (line 1261) | TEST(coroutine_socket, ssl_accept) {
  function TEST (line 1308) | TEST(coroutine_socket, peek) {
  function TEST (line 1332) | TEST(coroutine_socket, sendmsg_and_recvmsg) {
  function TEST (line 1398) | TEST(coroutine_socket, close) {
  function TEST (line 1448) | TEST(coroutine_socket, cancel) {
  function TEST (line 1475) | TEST(coroutine_socket, get_event_str) {
  function TEST (line 1481) | TEST(coroutine_socket, option) {
  function test_ssl_verify (line 1492) | static void test_ssl_verify() {
  function TEST (line 1519) | TEST(coroutine_socket, ssl_verify) {
  function TEST (line 1523) | TEST(coroutine_socket, shutdown) {
  function TEST (line 1540) | TEST(coroutine_socket, recv_packet) {
  function TEST (line 1554) | TEST(coroutine_socket, set_error) {
  function TEST (line 1562) | TEST(coroutine_socket, reinit) {

FILE: core-tests/src/coroutine/system.cpp
  function TEST (line 34) | TEST(coroutine_system, file) {
  function TEST (line 47) | TEST(coroutine_system, flock) {
  function TEST (line 81) | TEST(coroutine_system, flock_nb) {
  function TEST (line 108) | TEST(coroutine_system, cancel_sleep) {
  function test_getaddrinfo (line 119) | static void test_getaddrinfo(
  function TEST (line 133) | TEST(coroutine_system, getaddrinfo) {
  function TEST (line 140) | TEST(coroutine_system, getaddrinfo_fail) {
  function TEST (line 148) | TEST(coroutine_system, getaddrinfo_timeout) {
  function TEST (line 156) | TEST(coroutine_system, wait_signal) {
  function TEST (line 167) | TEST(coroutine_system, wait_signal_invalid_signo) {
  function TEST (line 174) | TEST(coroutine_system, wait_signal_fail) {
  function TEST (line 185) | TEST(coroutine_system, wait_event_readable) {
  function TEST (line 222) | TEST(coroutine_system, wait_event_writable) {
  function TEST (line 271) | TEST(coroutine_system, wait_event_fail) {
  function TEST (line 290) | TEST(coroutine_system, swoole_stream_select) {
  function TEST (line 328) | TEST(coroutine_system, timeout_is_zero) {
  function TEST (line 363) | TEST(coroutine_system, exec) {
  function TEST (line 372) | TEST(coroutine_system, waitpid) {
  function TEST (line 387) | TEST(coroutine_system, waitpid_any) {
  function TEST (line 402) | TEST(coroutine_system, read_file_fail) {
  function TEST (line 409) | TEST(coroutine_system, write_file_fail) {

FILE: core-tests/src/coroutine/uring_socket.cpp
  function TEST (line 39) | TEST(uring_socket, connect) {
  function TEST (line 63) | TEST(uring_socket, ssl_connect) {
  function TEST (line 94) | TEST(uring_socket, accept) {
  function TEST (line 133) | TEST(uring_socket, ssl_accept) {
  function socket_set_length_protocol_1 (line 200) | static void socket_set_length_protocol_1(UringSocket &sock) {
  function TEST (line 212) | TEST(uring_socket, length_3) {
  function TEST (line 243) | TEST(uring_socket, sendmsg_and_recvmsg) {
  function test_sendto_recvfrom (line 295) | static void test_sendto_recvfrom(enum swSocketType sock_type) {
  function TEST (line 344) | TEST(uring_socket, sendto_recvfrom_udp) {
  function TEST (line 349) | TEST(uring_socket, writev_and_readv) {
  function TEST (line 391) | TEST(uring_socket, writevall_and_readvall) {
  function TEST (line 446) | TEST(uring_socket, sendfile) {
  function TEST (line 468) | TEST(uring_socket, send_and_recv_all) {
  function TEST (line 499) | TEST(uring_socket, poll) {
  function TEST (line 522) | TEST(uring_socket, ssl_readv) {

FILE: core-tests/src/lock/lock.cpp
  function test_func (line 35) | static void test_func(Lock &lock) {
  function test_lock_rd_func (line 56) | static void test_lock_rd_func(Lock &lock) {
  function test_share_lock_fun (line 72) | static void test_share_lock_fun(Lock &lock) {
  function TEST (line 98) | TEST(lock, mutex) {
  function TEST (line 103) | TEST(lock, lockwait) {
  function TEST (line 129) | TEST(lock, shared) {
  function TEST (line 134) | TEST(lock, try_rd) {
  function TEST (line 139) | TEST(lock, coroutine_lock) {
  function TEST (line 167) | TEST(lock, coroutine_lock_cancel) {
  function TEST (line 183) | TEST(lock, coroutine_lock_rd) {
  function TEST (line 208) | TEST(lock, rwlock_shared) {
  function TEST (line 213) | TEST(lock, rwlock) {
  function TEST (line 218) | TEST(lock, rwlock_try_rd) {
  function TEST (line 223) | TEST(lock, rw_try_wr) {
  function TEST (line 241) | TEST(lock, spinlock_shared) {
  function TEST (line 246) | TEST(lock, spinlock) {
  function TEST (line 251) | TEST(lock, spinlock_try_rd) {

FILE: core-tests/src/main.cpp
  function main (line 15) | int main(int argc, char **argv) {
  function init_root_path (line 44) | static void init_root_path(const char *_exec_file) {
  type swoole::test (line 62) | namespace swoole::test {
    function counter_init (line 66) | void counter_init() {
    function counter_incr (line 74) | int counter_incr(int index, int add) {
    function counter_get (line 78) | int counter_get(int index) {
    function counter_set (line 82) | void counter_set(int index, int value) {
    function counter_incr_and_put_log (line 86) | void counter_incr_and_put_log(int index, const char *msg) {
    function string (line 93) | const string &get_root_path() {
    function string (line 97) | string get_ssl_dir() {
    function string (line 101) | string get_jpg_file() {
    function string (line 105) | string http_get_request(const string &domain, const string &path) {
    function is_github_ci (line 117) | bool is_github_ci() {
    function exec_js_script (line 121) | int exec_js_script(const std::string &file, const std::string &args) {
    function get_random_port (line 126) | int get_random_port() {
    function is_valid_fd (line 130) | bool is_valid_fd(int fd) {
    function wait_all_child_processes (line 134) | int wait_all_child_processes(bool verbose) {
    function has_child_processes (line 183) | int has_child_processes() {
    function has_threads (line 227) | int has_threads() {
    function is_directory_empty (line 256) | int is_directory_empty(const char *path) {
    function is_directory (line 283) | int is_directory(const char *path) {
    function get_parent_directory (line 298) | int get_parent_directory(const char *path, char *parent_path, size_t s...
    function recursive_rmdir (line 327) | int recursive_rmdir(const char *path) {
    function pid_t (line 357) | pid_t spawn_exec(const std::function<void(void)> &fn) {
    function spawn_exec_and_wait (line 368) | int spawn_exec_and_wait(const std::function<void(void)> &fn) {

FILE: core-tests/src/memory/buffer.cpp
  function TEST (line 27) | TEST(buffer, append_iov) {

FILE: core-tests/src/memory/fixed_pool.cpp
  function TEST (line 26) | TEST(fixed_pool, alloc) {
  function TEST (line 55) | TEST(fixed_pool, realloc) {

FILE: core-tests/src/memory/global_memory.cpp
  function TEST (line 23) | TEST(global_memory, alloc) {

FILE: core-tests/src/memory/lru_cache.cpp
  class lru_cache_test_class (line 8) | class lru_cache_test_class {
    method lru_cache_test_class (line 10) | lru_cache_test_class() {}
  function TEST (line 17) | TEST(lru_cache, basic) {
  function TEST (line 38) | TEST(lru_cache, memory_free) {
  function TEST (line 49) | TEST(lru_cache, lru_kick) {

FILE: core-tests/src/memory/ringbuffer.cpp
  function test_ringbuffer (line 32) | static void test_ringbuffer(bool shared) {
  function TEST (line 56) | TEST(ringbuffer, thread) {
  function thread_write (line 61) | static void thread_write() {
  function thread_read (line 105) | static void thread_read(int i) {

FILE: core-tests/src/memory/table.cpp
  type exception_t (line 28) | struct exception_t : public std::exception {
    method exception_t (line 31) | exception_t(std::string _msg, int _code) : std::exception() {
  type row_t (line 40) | struct row_t {
  class table_t (line 46) | class table_t {
    method table_t (line 55) | table_t(uint32_t rows_size, float conflict_proportion = 0.2) {
    method set (line 73) | bool set(const std::string &key, const row_t &value) {
    method row_t (line 90) | row_t get(const std::string &key) {
    method del (line 107) | bool del(const std::string &key) {
    method exists (line 111) | bool exists(const std::string &key) {
    method count (line 119) | size_t count() {
    method Table (line 123) | Table *ptr() {
  function TEST (line 134) | TEST(table, create) {
  function start_iterator (line 165) | void start_iterator(Table *_ptr) {
  function TEST (line 180) | TEST(table, iterator) {
  function TEST (line 191) | TEST(table, iterator_2) {
  function create_table (line 205) | static void create_table(table_t &table) {
  function TEST (line 216) | TEST(table, conflict1) {
  function TEST (line 239) | TEST(table, conflict2) {
  function TEST (line 255) | TEST(table, conflict3) {
  function TEST (line 268) | TEST(table, conflict4) {
  function TEST (line 284) | TEST(table, get_value) {
  function TEST (line 324) | TEST(table, lock) {
  function TEST (line 346) | TEST(table, size_limit) {
  function TEST (line 358) | TEST(table, lock_crash) {
  function TEST (line 377) | TEST(table, lock_race) {

FILE: core-tests/src/network/address.cpp
  function TEST (line 24) | TEST(address, basic) {
  function TEST (line 36) | TEST(address, dns_fail) {
  function TEST (line 42) | TEST(address, path_to_long) {
  function TEST (line 50) | TEST(address, bad_type) {
  function TEST (line 56) | TEST(address, type_str) {
  function TEST (line 63) | TEST(address, is_loopback_addr) {
  function TEST (line 81) | TEST(address, ipv4_addr) {
  function TEST (line 96) | TEST(address, ipv6_addr) {
  function TEST (line 111) | TEST(address, unix_addr) {
  function TEST (line 120) | TEST(address, bad_addr) {
  function TEST (line 130) | TEST(address, bad_port) {
  function TEST (line 136) | TEST(address, loopback_addr) {

FILE: core-tests/src/network/client.cpp
  function TEST (line 26) | TEST(client, tcp) {
  function test_sync_client_dgram (line 69) | static void test_sync_client_dgram(const char *host, int port, enum swSo...
  function TEST (line 107) | TEST(client, udp) {
  function TEST (line 112) | TEST(client, udp6) {
  function TEST (line 117) | TEST(client, udg) {
  function test_async_client_tcp (line 121) | static void test_async_client_tcp(const char *host, int port, enum swSoc...
  function TEST (line 175) | TEST(client, async_tcp) {
  function TEST (line 179) | TEST(client, async_tcp_dns) {
  function TEST (line 183) | TEST(client, async_tcp6) {
  function TEST (line 187) | TEST(client, async_tcp6_dns) {
  function TEST (line 191) | TEST(client, async_tcp_dns_fail) {
  function TEST (line 226) | TEST(client, async_tcp_ssl_handshake_fail) {
  function TEST (line 261) | TEST(client, async_tcp_http_proxy_handshake_fail) {
  function TEST (line 294) | TEST(client, async_tcp_socks5_proxy_handshake_fail) {
  function TEST (line 327) | TEST(client, sleep) {
  function TEST (line 355) | TEST(client, sleep_2) {
  function TEST (line 429) | TEST(client, connect_refuse) {
  function TEST (line 437) | TEST(client, bind) {
  type DNSHeader (line 451) | struct DNSHeader {
  function encodeDomainName (line 461) | std::vector<uint8_t> encodeDomainName(const std::string &domain) {
  function buildDNSQuery (line 492) | std::vector<uint8_t> buildDNSQuery(const std::string &domain, uint16_t r...
  function bytesToHexString (line 532) | std::string bytesToHexString(const std::vector<uint8_t> &data) {
  function TEST (line 545) | TEST(client, sendto) {
  function TEST (line 570) | TEST(client, async_unix_connect_refuse) {
  function TEST (line 598) | TEST(client, async_connect_timeout) {
  function test_async_client_dgram (line 626) | static void test_async_client_dgram(const char *host, int port, enum swS...
  function TEST (line 685) | TEST(client, async_udp) {
  function TEST (line 689) | TEST(client, async_udp_dns) {
  function TEST (line 693) | TEST(client, async_udp6) {
  function TEST (line 697) | TEST(client, connect_timeout) {
  function TEST (line 705) | TEST(client, shutdown_write) {
  function TEST (line 720) | TEST(client, shutdown_read) {
  function TEST (line 738) | TEST(client, shutdown_all) {
  function test_ssl_http_get (line 758) | static void test_ssl_http_get() {
  function TEST (line 789) | TEST(client, ssl_1) {
  function TEST (line 793) | TEST(client, ssl_sendfile) {
  function TEST (line 823) | TEST(client, sync_ssl_sendfile) {
  function proxy_async_test (line 845) | static void proxy_async_test(Client &client, bool https) {
  function proxy_sync_test (line 874) | static void proxy_sync_test(Client &client, bool https) {
  function proxy_set_socks5_proxy (line 901) | static void proxy_set_socks5_proxy(Client &client) {
  function proxy_set_http_proxy (line 907) | static void proxy_set_http_proxy(Client &client) {
  function TEST (line 916) | TEST(client, https_get_async_with_http_proxy) {
  function TEST (line 922) | TEST(client, https_get_async_with_socks5_proxy) {
  function TEST (line 928) | TEST(client, https_get_sync_with_http_proxy) {
  function TEST (line 934) | TEST(client, https_get_sync_with_socks5_proxy) {
  function TEST (line 940) | TEST(client, http_get_sync_with_socks5_proxy_no_dns_tunnel) {
  function TEST (line 947) | TEST(client, http_get_async_with_http_proxy) {
  function TEST (line 953) | TEST(client, http_get_async_with_socks5_proxy) {
  function TEST (line 959) | TEST(client, http_get_sync_with_http_proxy) {
  function TEST (line 965) | TEST(client, http_get_sync_with_socks5_proxy) {
  function TEST (line 971) | TEST(client, ssl) {
  function TEST (line 1017) | TEST(client, fail) {
  function test_recv_timeout (line 1023) | static void test_recv_timeout(Client &c) {
  function TEST (line 1046) | TEST(client, recv_timeout) {
  function TEST (line 1053) | TEST(client, ssl_recv_timeout) {
  function TEST (line 1062) | TEST(client, sync_nonblock) {

FILE: core-tests/src/network/dns.cpp
  function TEST (line 31) | TEST(dns, lookup1) {
  function TEST (line 38) | TEST(dns, lookup_ipv6) {
  function TEST (line 45) | TEST(dns, domain_not_found) {
  function TEST (line 53) | TEST(dns, bad_family) {
  function TEST (line 60) | TEST(dns, cancel) {
  function TEST (line 75) | TEST(dns, gethostbyname) {
  function TEST (line 85) | TEST(dns, getaddrinfo) {
  function TEST (line 98) | TEST(dns, getaddrinfo_fail) {
  function TEST (line 104) | TEST(dns, getaddrinfo_ipv6) {
  function TEST (line 119) | TEST(dns, load_resolv_conf) {
  function TEST (line 143) | TEST(dns, gethosts) {
  function name_resolver_test_fn_1 (line 183) | void name_resolver_test_fn_1() {
  function name_resolver_test_fn_2 (line 190) | void name_resolver_test_fn_2() {
  function TEST (line 229) | TEST(dns, name_resolve_1) {
  function TEST (line 234) | TEST(dns, name_resolve_2) {
  function TEST (line 239) | TEST(dns, name_resolve_fail) {

FILE: core-tests/src/network/socket.cpp
  function TEST (line 28) | TEST(socket, connect_sync) {
  function TEST (line 71) | TEST(socket, fail) {
  function TEST (line 107) | TEST(socket, ssl_fail) {
  function TEST (line 130) | TEST(socket, sendto) {
  function test_sendto (line 158) | static void test_sendto(enum swSocketType sock_type) {
  function TEST (line 184) | TEST(socket, sendto_ipv4) {
  function TEST (line 188) | TEST(socket, sendto_ipv6) {
  function TEST (line 192) | TEST(socket, recv) {
  function TEST (line 223) | TEST(socket, recvfrom_sync) {
  function TEST (line 254) | TEST(socket, send_async_1) {
  function TEST (line 271) | TEST(socket, send_async_2) {
  function TEST (line 297) | TEST(socket, sendfile_sync) {
  function TEST (line 337) | TEST(socket, sendfile) {
  function TEST (line 379) | TEST(socket, peek) {
  function TEST (line 408) | TEST(socket, sendto_sync) {
  function TEST (line 453) | TEST(socket, clean) {
  function TEST (line 485) | TEST(socket, check_liveness) {
  function test_socket_sync (line 533) | static void test_socket_sync(network::Socket *sock, bool connect = true) {
  function TEST (line 563) | TEST(socket, sync) {
  function TEST (line 568) | TEST(socket, dup) {
  function TEST (line 580) | TEST(socket, convert_to_type) {
  function test_sock_type (line 605) | static void test_sock_type(SocketType type, int expect_sock_domain, int ...
  function TEST (line 612) | TEST(socket, get_domain_and_type) {
  function TEST (line 631) | TEST(socket, make_socket) {
  function TEST (line 645) | TEST(socket, make_server_socket) {
  function TEST (line 669) | TEST(socket, ssl_get_error_reason) {
  function TEST (line 796) | TEST(socket, catch_error) {
  function TEST (line 805) | TEST(socket, misc) {

FILE: core-tests/src/network/stream.cpp
  function TEST (line 27) | TEST(stream, send) {

FILE: core-tests/src/os/async.cpp
  function TEST (line 31) | TEST(async, dispatch) {
  function TEST (line 53) | TEST(async, schedule) {
  function TEST (line 113) | TEST(async, misc) {

FILE: core-tests/src/os/file.cpp
  function TEST (line 27) | TEST(file, read_line) {
  function TEST (line 50) | TEST(file, read_line_no_crlf) {
  function TEST (line 66) | TEST(file, file_put_contents) {
  function TEST (line 79) | TEST(file, file_get_contents) {
  function TEST (line 103) | TEST(file, file_get_size) {
  function TEST (line 115) | TEST(file, open_twice) {
  function TEST (line 128) | TEST(file, error) {
  function TEST (line 147) | TEST(file, tmp_file) {
  function TEST (line 160) | TEST(file, empty_file) {

FILE: core-tests/src/os/msg_queue.cpp
  function TEST (line 26) | TEST(msg_queue, rbac) {

FILE: core-tests/src/os/os.cpp
  function TEST (line 27) | TEST(os, daemon) {
  function TEST (line 43) | TEST(os, cpu_affinity) {
  function TEST (line 66) | TEST(os, thread_name) {
  function TEST (line 81) | TEST(os, thread_id) {
  function TEST (line 87) | TEST(os, set_isolation) {

FILE: core-tests/src/os/pipe.cpp
  function TEST (line 6) | TEST(pipe, unixsock) {
  function TEST (line 36) | TEST(pipe, base) {

FILE: core-tests/src/os/process_pool.cpp
  function test_func (line 19) | static void test_func(ProcessPool &pool) {
  function test_func_task_protocol (line 43) | static void test_func_task_protocol(ProcessPool &pool) {
  function test_func_message_protocol (line 55) | static void test_func_message_protocol(ProcessPool &pool) {
  function test_func_stream_protocol (line 68) | static void test_func_stream_protocol(ProcessPool &pool) {
  function TEST (line 82) | TEST(process_pool, tcp) {
  function TEST (line 91) | TEST(process_pool, unix_sock) {
  function TEST (line 103) | TEST(process_pool, tcp_raw) {
  function TEST (line 130) | TEST(process_pool, msgqueue) {
  function TEST (line 137) | TEST(process_pool, msgqueue_2) {
  function TEST (line 151) | TEST(process_pool, message_protocol) {
  function TEST (line 158) | TEST(process_pool, message_protocol_with_timer) {
  function TEST (line 189) | TEST(process_pool, stream_protocol) {
  function TEST (line 196) | TEST(process_pool, stream_protocol_with_msgq) {
  function TEST (line 203) | TEST(process_pool, shutdown) {
  function TEST (line 247) | TEST(process_pool, reload) {
  function test_async_pool (line 323) | static void test_async_pool() {
  function TEST (line 379) | TEST(process_pool, async) {
  function test_async_pool_with_mb (line 384) | static void test_async_pool_with_mb() {
  function TEST (line 465) | TEST(process_pool, async_mb) {
  function TEST (line 469) | TEST(process_pool, mb1) {
  function TEST (line 478) | TEST(process_pool, mb2) {
  function TEST (line 488) | TEST(process_pool, socket) {
  function TEST (line 497) | TEST(process_pool, listen) {
  function TEST (line 565) | TEST(process_pool, listen_unixsock) {
  function TEST (line 624) | TEST(process_pool, worker) {
  function TEST (line 666) | TEST(process_pool, add_worker) {

FILE: core-tests/src/os/signal.cpp
  function sig_usr1 (line 6) | static void sig_usr1(int signo) {}
  function TEST (line 8) | TEST(os_signal, signalfd) {
  function TEST (line 39) | TEST(os_signal, block) {
  function TEST (line 52) | TEST(os_signal, unblock) {
  function TEST (line 69) | TEST(os_signal, signal_to_str) {
  function TEST (line 76) | TEST(os_signal, set) {
  function TEST (line 86) | TEST(os_signal, dispatch) {
  function TEST (line 109) | TEST(os_signal, error) {

FILE: core-tests/src/os/timer.cpp
  function TEST (line 28) | TEST(timer, sys) {
  function TEST (line 80) | TEST(timer, async) {
  function TEST (line 107) | TEST(timer, exists) {
  function TEST (line 114) | TEST(timer, clear) {
  function TEST (line 122) | TEST(timer, get) {
  function TEST (line 131) | TEST(timer, delay) {
  function TEST (line 146) | TEST(timer, error) {
  function TEST (line 171) | TEST(timer, reinit) {
  function TEST (line 207) | TEST(timer, realtime_add) {

FILE: core-tests/src/os/wait.cpp
  function pid_t (line 7) | static pid_t fork_child() {
  function pid_t (line 18) | static pid_t fork_child2() {
  function TEST (line 30) | TEST(os_wait, waitpid_before_child_exit) {
  function TEST (line 40) | TEST(os_wait, waitpid_after_child_exit) {
  function TEST (line 50) | TEST(os_wait, wait_before_child_exit) {
  function TEST (line 67) | TEST(os_wait, wait_after_child_exit) {
  function TEST (line 84) | TEST(os_wait, waitpid_safe) {

FILE: core-tests/src/protocol/base.cpp
  function test_protocol (line 32) | static void test_protocol(Server &serv, ListenPort *port, String *pkgs) {
  function TEST (line 81) | TEST(protocol, length) {
  function TEST (line 103) | TEST(protocol, length_2) {
  function TEST (line 182) | TEST(protocol, length_3) {
  function TEST (line 223) | TEST(protocol, eof) {
  function TEST (line 243) | TEST(protocol, socks5_strerror) {
  function TEST (line 254) | TEST(protocol, swap_byte_order) {
  function createBinaryData (line 299) | void createBinaryData(T value, char *buffer) {
  function TEST (line 303) | TEST(protocol, unpack) {
  function TEST (line 546) | TEST(protocol, hton64) {

FILE: core-tests/src/protocol/base64.cpp
  function TEST (line 23) | TEST(base64, encode) {
  function TEST (line 32) | TEST(base64, decode) {

FILE: core-tests/src/protocol/http2.cpp
  function TEST (line 40) | TEST(http2, default_settings) {
  function TEST (line 74) | TEST(http2, pack_setting_frame) {
  function TEST (line 115) | TEST(http2, get_type) {
  function TEST (line 128) | TEST(http2, get_type_color) {
  type Http2Session (line 134) | struct Http2Session {
    method Http2Session (line 141) | Http2Session(SessionId _fd, Server *_serv) : fd(_fd), session(nullptr)...
  function send_callback (line 184) | static ssize_t send_callback(nghttp2_session *session, const uint8_t *da...
  function on_stream_close_callback (line 196) | static int on_stream_close_callback(nghttp2_session *session, int32_t st...
  function on_header_callback (line 201) | static int on_header_callback(nghttp2_session *session,
  function on_begin_headers_callback (line 220) | static int on_begin_headers_callback(nghttp2_session *session, const ngh...
  function on_frame_recv_callback (line 232) | static int on_frame_recv_callback(nghttp2_session *session, const nghttp...
  function on_data_chunk_recv_callback (line 257) | static int on_data_chunk_recv_callback(
  function on_frame_not_send_callback (line 269) | static int on_frame_not_send_callback(nghttp2_session *session,
  function on_frame_send_callback (line 278) | static int on_frame_send_callback(nghttp2_session *session, const nghttp...
  function string_read_callback (line 286) | static ssize_t string_read_callback(nghttp2_session *session,
  function handle_request (line 306) | static void handle_request(nghttp2_session *session, int32_t stream_id, ...
  function http2_send_settings (line 370) | static void http2_send_settings(Http2Session *session_data, const nghttp...
  function create_http2_session (line 380) | static std::shared_ptr<Http2Session> create_http2_session(Server *serv, ...
  function test_ssl_http2 (line 414) | static void test_ssl_http2(Server::Mode mode) {
  function TEST (line 543) | TEST(http2, ssl) {

FILE: core-tests/src/protocol/mime_type.cpp
  function TEST (line 25) | TEST(mime_type, get) {
  function TEST (line 30) | TEST(mime_type, exists) {
  function TEST (line 34) | TEST(mime_type, set) {
  function TEST (line 42) | TEST(mime_type, add) {
  function TEST (line 51) | TEST(mime_type, del) {

FILE: core-tests/src/protocol/redis.cpp
  function TEST (line 31) | TEST(redis, get) {
  function TEST (line 40) | TEST(redis, server) {
  function TEST (line 120) | TEST(redis, format) {
  function TEST (line 132) | TEST(redis, parse) {

FILE: core-tests/src/protocol/ssl.cpp
  function TEST (line 31) | TEST(ssl, destroy) {
  function TEST (line 37) | TEST(ssl, get_error) {
  function TEST (line 69) | TEST(ssl, password) {

FILE: core-tests/src/reactor/base.cpp
  function TEST (line 30) | TEST(reactor, create) {
  function TEST (line 66) | TEST(reactor, set_handler) {
  function TEST (line 82) | TEST(reactor, wait) {
  function TEST (line 115) | TEST(reactor, write) {
  function TEST (line 150) | TEST(reactor, wait_timeout) {
  function TEST (line 165) | TEST(reactor, wait_error) {
  function TEST (line 177) | TEST(reactor, writev) {
  function TEST (line 210) | TEST(reactor, write_2m) {
  function TEST (line 266) | TEST(reactor, bad_fd) {
  function reactor_test_func (line 280) | static void reactor_test_func(Reactor *reactor) {
  function TEST (line 329) | TEST(reactor, epoll) {
  function TEST (line 335) | TEST(reactor, poll) {
  function TEST (line 341) | TEST(reactor, poll_extra) {
  function TEST (line 391) | TEST(reactor, poll_extra2) {
  function TEST (line 419) | TEST(reactor, add_or_update) {
  function TEST (line 440) | TEST(reactor, defer_task) {
  function TEST (line 452) | TEST(reactor, cycle) {
  function event_idle_callback (line 470) | static void event_idle_callback(void *data) {
  function TEST (line 474) | TEST(reactor, priority_idle_task) {
  function TEST (line 484) | TEST(reactor, hook) {
  function TEST (line 513) | TEST(reactor, set_fd) {
  function test_error_event (line 526) | static void test_error_event(Reactor::Type type, int retval) {
  function TEST (line 550) | TEST(reactor, error_event) {
  function TEST (line 558) | TEST(reactor, error) {
  function TEST (line 593) | TEST(reactor, drain_write_buffer) {
  function TEST (line 640) | TEST(reactor, handle_fail) {

FILE: core-tests/src/server/buffer.cpp
  function TEST (line 28) | TEST(server, send_buffer) {

FILE: core-tests/src/server/http_parser.cpp
  type HttpContext (line 66) | struct HttpContext {
  function llhttp_t (line 101) | static llhttp_t *swoole_http_parser_create(llhttp_type type = HTTP_REQUE...
  function swoole_http_destroy_context (line 108) | static void swoole_http_destroy_context(llhttp_t *parser) {
  function http_request_on_url (line 112) | static int http_request_on_url(llhttp_t *parser, const char *at, size_t ...
  function http_request_on_header_field (line 118) | static int http_request_on_header_field(llhttp_t *parser, const char *at...
  function http_request_on_header_value (line 124) | static int http_request_on_header_value(llhttp_t *parser, const char *at...
  function http_request_on_headers_complete (line 130) | static int http_request_on_headers_complete(llhttp_t *parser) {
  function http_request_on_body (line 134) | static int http_request_on_body(llhttp_t *parser, const char *at, size_t...
  function http_request_message_complete (line 138) | static int http_request_message_complete(llhttp_t *parser) {
  function http_llhttp_data_cb (line 144) | static int http_llhttp_data_cb(llhttp_t *parser, const char *at, size_t ...
  function http_llhttp_cb (line 148) | static int http_llhttp_cb(llhttp_t *parser) {
  function TEST (line 152) | TEST(http_parser, get_request) {
  function TEST (line 172) | TEST(http_parser, version) {
  function TEST (line 189) | TEST(http_parser, incomplete) {
  function TEST (line 205) | TEST(http_parser, method) {
  function TEST (line 219) | TEST(http_parser, websocket) {
  function TEST (line 241) | TEST(http_parser, http2) {
  function TEST (line 254) | TEST(http_parser, header_field_and_value) {
  function TEST (line 283) | TEST(http_parser, query_string) {
  function TEST (line 298) | TEST(http_parser, chunk) {
  function TEST (line 323) | TEST(http_parser, response) {
  function TEST (line 566) | TEST(http_parser, request_error_case) {
  function TEST (line 582) | TEST(http_parser, response_error_case) {
  function TEST (line 679) | TEST(http_parser, request_success_case) {
  function TEST (line 753) | TEST(http_parser, response_success_case) {

FILE: core-tests/src/server/http_server.cpp
  type http_context (line 42) | struct http_context {
    method setHeader (line 51) | void setHeader(string key, string value) {
    method response (line 55) | void response(enum swHttpStatusCode code, string body) {
    method response (line 61) | void response(int code) {
    method dump_headers (line 75) | void dump_headers() {
    method base64Encode (line 81) | static std::string base64Encode(const unsigned char *input, int length) {
    method createWebSocketAccept (line 101) | std::string createWebSocketAccept() {
  function handle_on_message_complete (line 111) | static int handle_on_message_complete(llhttp_t *parser) {
  function handle_on_header_field (line 117) | static int handle_on_header_field(llhttp_t *parser, const char *at, size...
  function handle_on_header_value (line 123) | static int handle_on_header_value(llhttp_t *parser, const char *at, size...
  function handle_on_url (line 129) | static int handle_on_url(llhttp_t *parser, const char *at, size_t length) {
  function test_base_server (line 135) | static void test_base_server(function<void(Server *)> fn) {
  function Server (line 267) | static Server *test_http_server(Server::DispatchMode dispatch_mode = Ser...
  function Server (line 358) | static Server *test_proxy_server() {
  function TEST (line 422) | TEST(http_server, get) {
  function TEST (line 437) | TEST(http_server, reset_connection) {
  function TEST (line 454) | TEST(http_server, heartbeat_check_interval) {
  function TEST (line 471) | TEST(http_server, idle_time) {
  function TEST (line 487) | TEST(http_server, post) {
  function TEST (line 505) | TEST(http_server, static_get) {
  function TEST (line 529) | TEST(http_server, static_files) {
  function request_with_header (line 568) | static void request_with_header(const char *date_format, httplib::Client...
  function TEST (line 579) | TEST(http_server, not_modify) {
  function TEST (line 602) | TEST(http_server, proxy_file) {
  function TEST (line 626) | TEST(http_server, proxy_response) {
  function websocket_test (line 648) | static void websocket_test(int server_port, const char *data, size_t len...
  function TEST (line 664) | TEST(http_server, websocket_small) {
  function TEST (line 672) | TEST(http_server, websocket_medium) {
  function TEST (line 684) | TEST(http_server, websocket_big) {
  function TEST (line 696) | TEST(http_server, websocket_mask) {
  function TEST (line 711) | TEST(http_server, websocket_encode) {
  function TEST (line 744) | TEST(http_server, node_websocket_client_1) {
  function TEST (line 765) | TEST(http_server, node_websocket_client_2) {
  function TEST (line 785) | TEST(http_server, parser1) {
  function TEST (line 816) | TEST(http_server, parser2) {
  function TEST (line 849) | TEST(http_server, upload) {
  function TEST (line 883) | TEST(http_server, max_request_size) {
  function TEST (line 917) | TEST(http_server, heartbeat) {
  function TEST (line 949) | TEST(http_server, overflow) {
  function TEST (line 977) | TEST(http_server, process) {
  function TEST (line 1005) | TEST(http_server, process1) {
  function TEST (line 1032) | TEST(http_server, redundant_callback) {
  function TEST (line 1056) | TEST(http_server, pause) {
  function TEST (line 1084) | TEST(http_server, sni) {
  function TEST (line 1140) | TEST(http_server, bad_request) {
  function TEST (line 1178) | TEST(http_server, chunked) {
  function TEST (line 1210) | TEST(http_server, max_queued_bytes) {
  function TEST (line 1244) | TEST(http_server, dispatch_func_return_error_worker_id) {
  function TEST (line 1272) | TEST(http_server, client_ca) {
  function request_with_if_range_header (line 1314) | static bool request_with_if_range_header(const char *date_format, std::s...
  function TEST (line 1348) | TEST(http_server, http_range) {
  function request_with_diff_range (line 1374) | static bool request_with_diff_range(std::string port, std::string range) {
  function TEST (line 1399) | TEST(http_server, http_range2) {
  function TEST (line 1420) | TEST(http_server, abort_connection) {
  function TEST (line 1471) | TEST(http_server, EncodeDecodeBasic) {
  function TEST (line 1486) | TEST(http_server, EncodeDecodeWithSpecialChars) {
  function TEST (line 1501) | TEST(http_server, get_method) {
  function TEST (line 1507) | TEST(http_server, get_method_str) {
  function TEST (line 1513) | TEST(http_server, has_expect_header) {
  function TEST (line 1534) | TEST(http_server, get_status_message) {
  function SetRequestContent (line 1553) | static void SetRequestContent(const std::string &str) {
  function SetRequestContent (line 1559) | static void SetRequestContent(String *str) {
  function TEST (line 1564) | TEST(http_server, get_protocol) {
  function TEST (line 1690) | TEST(http_server, all_method) {
  function TEST (line 1709) | TEST(http_server, parse_multipart_boundary) {
  function TEST (line 1818) | TEST(http_server, get_package_length) {
  function test_ssl_http (line 1882) | static void test_ssl_http(Server::Mode mode) {
  function TEST (line 1951) | TEST(http_server, ssl) {
  function TEST (line 1955) | TEST(http_server, fail) {

FILE: core-tests/src/server/message_bus.cpp
  type TestPacket (line 32) | struct TestPacket {
  type TestMB (line 37) | struct TestMB {
    method send_empty_packet (line 42) | bool send_empty_packet(network::Socket *sock) {
    method read (line 62) | int read(Event *ev) {
  function TEST (line 102) | TEST(message_bus, read) {
  function TEST (line 149) | TEST(message_bus, read_with_buffer) {

FILE: core-tests/src/server/mqtt.cpp
  type MqttPacketType (line 31) | enum MqttPacketType {
  function current_timestamp (line 41) | std::string current_timestamp() {
  type MqttSession (line 52) | struct MqttSession {
    method MqttSession (line 60) | MqttSession(Server *_server, SessionId fd_) : fd(fd_), server(_server) {}
    method send_connack (line 63) | bool send_connack() {
    method send_suback (line 74) | bool send_suback(uint16_t packet_id) {
    method send_publish (line 86) | bool send_publish(const std::string &topic, const std::string &message) {
    method send_puback (line 121) | bool send_puback(uint16_t packet_id) {
    method send_disconnect (line 126) | bool send_disconnect() {
    method process_packet (line 131) | bool process_packet(const uint8_t *data, size_t len) {
  function test_mqtt_server (line 211) | static void test_mqtt_server(function<void(Server *)> fn) {
  function TEST (line 271) | TEST(mqtt, echo) {

FILE: core-tests/src/server/multipart_parser.cpp
  type MppResult (line 22) | struct MppResult {
  function multipart_on_header_field (line 30) | static int multipart_on_header_field(multipart_parser *p, const char *at...
  function multipart_on_header_value (line 37) | static int multipart_on_header_value(multipart_parser *p, const char *at...
  function multipart_on_data (line 44) | static int multipart_on_data(multipart_parser *p, const char *at, size_t...
  function multipart_on_header_complete (line 51) | static int multipart_on_header_complete(multipart_parser *p) {
  function multipart_on_data_end (line 58) | static int multipart_on_data_end(multipart_parser *p) {
  function multipart_on_part_begin (line 63) | static int multipart_on_part_begin(multipart_parser *p) {
  function multipart_on_body_end (line 68) | static int multipart_on_body_end(multipart_parser *p) {
  function multipart_parser (line 87) | static multipart_parser *create_parser() {
  function create_error (line 91) | static void create_error(multipart_parser *parser, multipart_error error...
  function TEST (line 104) | TEST(multipart_parser, error_message) {
  function TEST (line 149) | TEST(multipart_parser, header_field) {
  function TEST (line 174) | TEST(multipart_parser, header_error) {
  function TEST (line 193) | TEST(multipart_parser, data) {

FILE: core-tests/src/server/port.cpp
  function TEST (line 28) | TEST(server_port, import) {
  function TEST (line 39) | TEST(server_port, create) {
  function TEST (line 57) | TEST(server_port, dgram) {

FILE: core-tests/src/server/server.cpp
  function TEST (line 36) | TEST(server, schedule) {
  function TEST (line 72) | TEST(server, schedule_1) {
  function average_combined (line 96) | double average_combined(const std::vector<size_t> &v1, const std::vector...
  function test_worker_schedule (line 105) | static void test_worker_schedule(int dispatch_mode) {
  function TEST (line 145) | TEST(server, schedule_4) {
  function TEST (line 201) | TEST(server, schedule_5) {
  function TEST (line 253) | TEST(server, schedule_8) {
  function TEST (line 307) | TEST(server, schedule_9) {
  function TEST (line 311) | TEST(server, schedule_10) {
  function test_base (line 317) | static void test_base() {
  function TEST (line 413) | TEST(server, base) {
  function test_process (line 417) | static void test_process(bool single_thread = false) {
  function TEST (line 546) | TEST(server, process) {
  function TEST (line 551) | TEST(server, process_single_thread) {
  function test_process_send_in_user_worker (line 556) | static void test_process_send_in_user_worker() {
  function TEST (line 621) | TEST(server, thread) {
  function TEST (line 702) | TEST(server, task_thread) {
  function TEST (line 783) | TEST(server, reload_thread) {
  function TEST (line 861) | TEST(server, reload_thread_2) {
  function TEST (line 931) | TEST(server, reload_thread_3) {
  function TEST (line 979) | TEST(server, reload_all_workers) {
  function TEST (line 1042) | TEST(server, reload_all_workers2) {
  function TEST (line 1102) | TEST(server, kill_user_workers) {
  function TEST (line 1145) | TEST(server, force_kill_all_workers) {
  function TEST (line 1193) | TEST(server, kill_user_workers1) {
  function TEST (line 1228) | TEST(server, create_task_worker_fail) {
  function TEST (line 1241) | TEST(server, ssl) {
  function TEST (line 1309) | TEST(server, ssl_error) {
  function TEST (line 1362) | TEST(server, ssl_write) {
  function TEST (line 1434) | TEST(server, dtls) {
  function TEST (line 1515) | TEST(server, dtls2) {
  function test_ssl_client_cert (line 1559) | static void test_ssl_client_cert(Server::Mode mode) {
  function TEST (line 1642) | TEST(server, ssl_client_cert_1) {
  function TEST (line 1646) | TEST(server, ssl_client_cert_2) {
  function TEST (line 1650) | TEST(server, ssl_client_cert_3) {
  function TEST (line 1654) | TEST(server, task_worker) {
  function TEST (line 1706) | TEST(server, task_worker2) {
  function TEST (line 1760) | TEST(server, task_worker_3) {
  function TEST (line 1794) | TEST(server, reload_single_process) {
  function TEST (line 1824) | TEST(server, reload_no_task_worker) {
  function test_task (line 1853) | static void test_task(Server::Mode mode, uint8_t task_ipc_mode = Server:...
  function TEST (line 1901) | TEST(server, task_base) {
  function TEST (line 1905) | TEST(server, task_process) {
  function TEST (line 1909) | TEST(server, task_ipc_stream) {
  function TEST (line 1914) | TEST(server, task_worker3) {
  function TEST (line 1961) | TEST(server, task_worker4) {
  function TEST (line 2017) | TEST(server, task_sync_multi_task) {
  function TEST (line 2091) | TEST(server, task_sync) {
  function test_task_ipc (line 2128) | static void test_task_ipc(Server &serv) {
  function TEST (line 2171) | TEST(server, task_ipc_queue_1) {
  function TEST (line 2180) | TEST(server, task_ipc_queue_2) {
  function TEST (line 2189) | TEST(server, task_ipc_queue_3) {
  function TEST (line 2198) | TEST(server, task_ipc_queue_4) {
  function TEST (line 2207) | TEST(server, task_ipc_queue_5) {
  function TEST (line 2218) | TEST(server, max_connection) {
  function TEST (line 2247) | TEST(server, min_connection) {
  function TEST (line 2260) | TEST(server, worker_num) {
  function TEST (line 2274) | TEST(server, reactor_num_base) {
  function TEST (line 2283) | TEST(server, reactor_num_large) {
  function TEST (line 2293) | TEST(server, reactor_num_large2) {
  function TEST (line 2302) | TEST(server, reactor_num_zero) {
  function test_command (line 2311) | void test_command(enum Server::Mode _mode) {
  function TEST (line 2373) | TEST(server, command_1) {
  function TEST (line 2377) | TEST(server, command_2) {
  function TEST (line 2381) | TEST(server, sendwait) {
  function TEST (line 2424) | TEST(server, system) {
  function TEST (line 2478) | TEST(server, reopen_log) {
  function TEST (line 2508) | TEST(server, reopen_log2) {
  function TEST (line 2533) | TEST(server, udp_packet) {
  function TEST (line 2577) | TEST(server, protocols) {
  function TEST (line 2634) | TEST(server, pipe_message) {
  function TEST (line 2664) | TEST(server, forward_message) {
  function TEST (line 2714) | TEST(server, abnormal_pipeline_data) {
  function TEST (line 2758) | TEST(server, startup_error) {
  function TEST (line 2792) | TEST(server, abort_worker) {
  function TEST (line 2861) | TEST(server, reactor_thread_pipe_writable) {
  function test_heartbeat_check (line 2941) | static void test_heartbeat_check(Server::Mode mode, bool single_thread =...
  function TEST (line 2985) | TEST(server, heartbeat_check_1) {
  function TEST (line 2989) | TEST(server, heartbeat_check_2) {
  function TEST (line 2993) | TEST(server, heartbeat_check_3) {
  function TEST (line 2997) | TEST(server, heartbeat_check_4) {
  function test_close (line 3001) | static void test_close(Server::Mode mode, bool close_in_client, bool sin...
  function TEST (line 3078) | TEST(server, close_1) {
  function TEST (line 3082) | TEST(server, close_2) {
  function TEST (line 3086) | TEST(server, close_3) {
  function TEST (line 3090) | TEST(server, close_4) {
  function TEST (line 3094) | TEST(server, close_5) {
  function TEST (line 3098) | TEST(server, close_6) {
  function TEST (line 3102) | TEST(server, close_7) {
  function TEST (line 3106) | TEST(server, close_8) {
  function TEST (line 3110) | TEST(server, eof_check) {
  function test_clean_worker (line 3178) | static void test_clean_worker(Server::Mode mode) {
  function TEST (line 3252) | TEST(server, clean_worker_1) {
  function TEST (line 3256) | TEST(server, clean_worker_2) {
  type Options (line 3260) | struct Options {
  function test_kill_worker (line 3268) | static void test_kill_worker(Server::Mode mode, const Options &options) {
  function TEST (line 3380) | TEST(server, kill_worker_1) {
  function TEST (line 3386) | TEST(server, kill_worker_2) {
  function TEST (line 3392) | TEST(server, kill_worker_3) {
  function TEST (line 3398) | TEST(server, kill_worker_4) {
  function TEST (line 3404) | TEST(server, kill_worker_5) {
  function TEST (line 3410) | TEST(server, kill_worker_6) {
  function TEST (line 3416) | TEST(server, worker_exit) {
  function TEST (line 3422) | TEST(server, shutdown_event) {
  function test_kill_self (line 3428) | static void test_kill_self(Server::Mode mode) {
  function TEST (line 3504) | TEST(server, kill_self) {
  function TEST (line 3508) | TEST(server, no_idle_worker) {
  function TEST (line 3569) | TEST(server, no_idle_task_worker) {
  function test_conn_overflow (line 3639) | static void test_conn_overflow(Server::Mode mode, bool send_yield) {
  function TEST (line 3710) | TEST(server, overflow_1) {
  function TEST (line 3714) | TEST(server, overflow_2) {
  function TEST (line 3718) | TEST(server, overflow_3) {
  function TEST (line 3722) | TEST(server, overflow_4) {
  function TEST (line 3726) | TEST(server, send_timeout) {
  function test_max_request (line 3817) | static void test_max_request(Server::Mode mode) {
  function TEST (line 3874) | TEST(server, max_request_1) {
  function TEST (line 3878) | TEST(server, max_request_2) {
  function TEST (line 3882) | TEST(server, watermark) {
  function TEST (line 3952) | TEST(server, discard_data) {
  function TEST (line 4018) | TEST(server, pause_and_resume) {
  function TEST (line 4079) | TEST(server, max_queued_bytes) {
  function TEST (line 4137) | TEST(server, ssl_matches_wildcard_name) {
  function TEST (line 4254) | TEST(server, wait_other_worker) {

FILE: examples/client/get_socket.php
  function getClient (line 3) | function getClient()

FILE: examples/coroutine/backtrace.php
  function test1 (line 2) | function test1() {
  function test2 (line 6) | function test2() {
  function get_debug_print_backtrace (line 25) | function get_debug_print_backtrace($traces){
  function get_arg (line 46) | function get_arg(&$arg) {

FILE: examples/coroutine/channel/test.php
  function BatchExecMethodByCo (line 2) | function BatchExecMethodByCo()
  function test (line 21) | function test($value='')
  function test2 (line 26) | function test2($value='')

FILE: examples/coroutine/coro_array_map.php
  function test (line 10) | function test($p) {

FILE: examples/coroutine/coro_call_user.php
  function test (line 12) | function test($params)

FILE: examples/coroutine/coro_destruct.php
  class T (line 3) | class T
    method __construct (line 5) | function __construct()
    method test (line 10) | function test()
    method __destruct (line 15) | function __destruct()

FILE: examples/coroutine/coro_destuct.php
  class T (line 4) | class T
    method __construct (line 6) | function __construct()
    method test (line 11) | function test()
    method __destruct (line 16) | function __destruct()

FILE: examples/coroutine/coro_invoke.php
  function title (line 15) | function title() {

FILE: examples/coroutine/coro_nested_empty.php
  function test (line 3) | function test()

FILE: examples/coroutine/coro_serialize.php
  class Obj (line 3) | class Obj {
    method __construct (line 9) | function __construct($a, $b, $c, $d) {
    method __sleep (line 16) | function __sleep() {

FILE: examples/coroutine/exit_in_coroutine.php
  function route (line 2) | function route()
  function controller (line 7) | function controller()
  function your_code (line 12) | function your_code()

FILE: examples/coroutine/http_backend_serv.php
  class Server (line 10) | class Server
    method run (line 14) | public function run()
    method onRequest (line 25) | public static function onRequest($request, $response)
    method staticFunc (line 32) | public static function staticFunc()

FILE: examples/coroutine/http_server.php
  class Server (line 4) | class Server
    method run (line 9) | public function run()
    method onRequest (line 23) | public function onRequest($request, $response)

FILE: examples/coroutine/httpmulti.php
  class Server (line 10) | class Server
    method run (line 14) | public function run()
    method https (line 26) | private static function https(){
    method http (line 43) | private static function http(){
    method multihttp (line 64) | private static function multihttp(){
    method tcp (line 107) | private static function tcp(){
    method coro_dns (line 117) | private static function coro_dns(){
    method tcpmulti (line 129) | private static function tcpmulti(){
    method onRequest (line 142) | public static function onRequest($request, $response)
    method staticFunc (line 154) | public static function staticFunc()

FILE: examples/coroutine/library/base.php
  class R (line 2) | class R
    method __construct (line 4) | public function __construct()
    method __destruct (line 10) | public function __destruct()
  class Pool (line 17) | class Pool extends \Swoole\Coroutine\ObjectPool
    method __construct (line 19) | public function __construct($type)
    method create (line 24) | public function create()

FILE: examples/coroutine/mysql_query.php
  function title (line 15) | function title() {

FILE: examples/coroutine/select/5.php
  function fibonacci (line 4) | function fibonacci($c1, $c2)

FILE: examples/coroutine/stack.php
  function test (line 4) | function test($n)

FILE: examples/coroutine/test.php
  function BatchExecMethodByCo (line 2) | function BatchExecMethodByCo($channel,$funcs)
  function test (line 11) | function test($value='')
  function test2 (line 16) | function test2($value='')

FILE: examples/coroutine/udp_client.php
  class Client (line 2) | class Client
    method sendRequest (line 8) | public function sendRequest()
    method send (line 16) | public function send()
    method moreThanOneRecv (line 25) | public function moreThanOneRecv()
  class Server (line 47) | class Server
    method run (line 51) | public function run()
    method onRequest (line 63) | public static function onRequest($request, $response)

FILE: examples/coroutine/udp_tcp_timeout.php
  class TestHttpServer (line 9) | class TestHttpServer {
    method __construct (line 19) | public function __construct(){
    method set (line 23) | public function set($setting){
    method init (line 32) | public function init(){
    method onRequest (line 54) | public function onRequest($request, $response){
    method onClose (line 94) | public function onClose($server, $fd, $reactor_id){
    method start (line 103) | public function start(){

FILE: examples/coroutine/waitgroup.php
  class WaitGroup (line 2) | class WaitGroup {
    method __construct (line 6) | function __construct() {
    method add (line 10) | function add() {
    method done (line 14) | function done() {
    method wait (line 18) | function wait() {

FILE: examples/cpp/co.cc
  function main (line 20) | int main(int argc, char **argv) {

FILE: examples/cpp/repeat.cc
  function main (line 4) | int main(int argc, char **argv) {

FILE: examples/cpp/test_server.cc
  function main (line 22) | int main(int argc, char **argv) {
  function my_onWorkerStart (line 86) | void my_onWorkerStart(Server *serv, Worker *worker) {
  function my_onWorkerStop (line 90) | void my_onWorkerStop(Server *serv, Worker *worker) {
  function my_onReceive (line 94) | int my_onReceive(Server *serv, RecvData *req) {
  function my_onPacket (line 121) | int my_onPacket(Server *serv, RecvData *req) {
  function my_onStart (line 161) | void my_onStart(Server *serv) {
  function my_onShutdown (line 165) | void my_onShutdown(Server *serv) {
  function my_onConnect (line 169) | void my_onConnect(Server *serv, DataHead *info) {
  function my_onClose (line 173) | void my_onClose(Server *serv, DataHead *info) {

FILE: examples/curl/hook.php
  function test (line 12) | function test() {

FILE: examples/curl/multi.php
  function test (line 3) | function test()

FILE: examples/eof/client.php
  function send_chunk (line 9) | function send_chunk(Swoole\Client $client, $data, $chunk_size = 1024)

FILE: examples/event/sockets.php
  function socket_onRead (line 12) | function socket_onRead($socket)
  function socket_onWrite (line 28) | function socket_onWrite($socket)
  function socket_onConnect (line 34) | function socket_onConnect($socket)

FILE: examples/event/stream.php
  function stream_onRead (line 8) | function stream_onRead($fp)

FILE: examples/http/server.php
  function dump (line 2) | function dump($var)
  function chunk (line 44) | function chunk(Swoole\Http\Request $request, Swoole\Http\Response $respo...
  function no_chunk (line 53) | function no_chunk(Swoole\Http\Request $request, Swoole\Http\Response $re...

FILE: examples/length/server.php
  function send (line 14) | function send(Swoole\Server $serv, $fd, $data)

FILE: examples/php/debug_server.php
  class DebugServer (line 3) | class DebugServer
    method package_decode (line 9) | function package_decode($pkg)
    method run (line 46) | function run()

FILE: examples/php/func.php
  function test (line 3) | function test()

FILE: examples/process/async_master.php
  function onReceive (line 7) | function onReceive($pipe) {

FILE: examples/process/client.php
  function _send (line 9) | function _send(Swoole\Client $client, $data)

FILE: examples/process/echo.py
  function main (line 3) | def main():

FILE: examples/process/exec.php
  function callback_function (line 5) | function callback_function(Swoole\Process $worker)

FILE: examples/process/func_timeout.php
  class FunctionTimeoutException (line 7) | class FunctionTimeoutException extends RuntimeException
  function test (line 12) | function test()

FILE: examples/process/msgqueue.php
  function callback_function (line 14) | function callback_function(Swoole\Process $worker)

FILE: examples/process/msgqueue2.php
  function callback_function (line 2) | function callback_function(Swoole\Process $worker)

FILE: examples/process/python.php
  function pyhon_process (line 5) | function pyhon_process(Swoole\Process $worker)

FILE: examples/process/worker.php
  function master_async (line 20) | function master_async($workers)
  function master_sync (line 58) | function master_sync($workers)
  function child_sync (line 67) | function child_sync(Swoole\Process $worker)
  function child_async (line 82) | function child_async(Swoole\Process $worker)

FILE: examples/runtime/include.php
  function test (line 2) | function test()

FILE: examples/runtime/oci.php
  function test (line 2) | function test()

FILE: examples/runtime/odbc.php
  function test (line 5) | function test()

FILE: examples/server/db_pool.php
  function my_onRequest_sync (line 12) | function my_onRequest_sync($req, $resp)
  function my_onTask (line 28) | function my_onTask($serv, $task_id, $reactor_id, $sql)
  function my_onFinish (line 49) | function my_onFinish($serv, $data)

FILE: examples/server/echo.php
  function getpid (line 6) | function getpid()

FILE: examples/server/eof_client.php
  function send_test3 (line 25) | function send_test3($client, $len)
  function send_test2 (line 37) | function send_test2($client, $len)
  function send_test1 (line 46) | function send_test1($client, $len)

FILE: examples/server/eof_server.php
  class SocketServer (line 5) | class SocketServer
    method run (line 11) | function run($host, $port)
    method onReceive (line 27) | function onReceive($serv, $fd, $tid, $data)

FILE: examples/server/host_update.php
  function my_onStart (line 14) | function my_onStart($serv)
  function my_onShutdown (line 20) | function my_onShutdown($serv)
  function my_onClose (line 25) | function my_onClose($serv, $fd, $reactor_id)
  function my_onConnect (line 30) | function my_onConnect($serv, $fd, $reactor_id)
  function my_onWorkerStart (line 38) | function my_onWorkerStart($serv, $worker_id)
  function my_onWorkerStop (line 53) | function my_onWorkerStop($serv, $worker_id)
  function my_onReceive (line 58) | function my_onReceive(Swoole\Server $serv, $fd, $reactor_id, $data)
  function my_onTask (line 98) | function my_onTask(Swoole\Server $serv, $task_id, $reactor_id, $data)
  function my_onFinish (line 104) | function my_onFinish(Swoole\Server $serv, $data)

FILE: examples/server/hot_update_class.php
  class HotUpdate (line 2) | class HotUpdate {
    method getData (line 3) | public function getData()

FILE: examples/server/length_client.php
  function send_test3 (line 27) | function send_test3($client, $len)
  function send_test2 (line 39) | function send_test2($client, $len)
  function send_test1 (line 48) | function send_test1($client, $len)

FILE: examples/server/length_server.php
  class SocketServer (line 5) | class SocketServer
    method run (line 11) | function run($host, $port)
    method onReceive (line 30) | function onReceive($serv, $fd, $tid, $data)

FILE: examples/server/mixed.php
  class G (line 4) | class G
  function my_onStart (line 87) | function my_onStart(Swoole\Server $serv)
  function my_log (line 95) | function my_log($msg)
  function forkChildInWorker (line 104) | function forkChildInWorker()
  function processRename (line 129) | function processRename(Swoole\Server $serv, $worker_id)
  function setTimerInWorker (line 144) | function setTimerInWorker(Swoole\Server $serv, $worker_id)
  function my_onShutdown (line 162) | function my_onShutdown($serv)
  function my_onClose (line 167) | function my_onClose(Swoole\Server $serv, $fd, $reactor_id)
  function my_onConnect (line 173) | function my_onConnect(Swoole\Server $serv, $fd, $reactor_id)
  function timer_show (line 185) | function timer_show($id)
  function my_onWorkerExit (line 190) | function my_onWorkerExit(Swoole\Server $serv, $worker_id)
  function my_onWorkerStart (line 195) | function my_onWorkerStart(Swoole\Server $serv, $worker_id)
  function my_onWorkerStop (line 227) | function my_onWorkerStop($serv, $worker_id)
  function my_onPacket (line 232) | function my_onPacket($serv, $data, $clientInfo)
  function my_onReceive (line 238) | function my_onReceive(Swoole\Server $serv, $fd, $reactor_id, $data)
  function my_onTask (line 361) | function my_onTask(Swoole\Server $serv, $task_id, $reactor_id, $data)
  function my_onFinish (line 398) | function my_onFinish(Swoole\Server $serv, $task_id, $data)
  function my_onWorkerError (line 406) | function my_onWorkerError(Swoole\Server $serv, $worker_id, $worker_pid, ...
  function broadcast (line 411) | function broadcast(Swoole\Server $serv, $fd = 0, $data = 'hello')

FILE: examples/server/proxy_sync.php
  class ProxyServer (line 2) | class ProxyServer
    method run (line 8) | function run()
    method onStart (line 27) | function onStart($serv)
    method onShutdown (line 33) | function onShutdown($serv)
    method onClose (line 38) | function onClose($serv, $fd, $reactor_id)
    method onConnect (line 43) | function onConnect($serv, $fd, $reactor_id)
    method onReceive (line 48) | function onReceive($serv, $fd, $reactor_id, $data)

FILE: examples/server/redis_pool.php
  function onStart (line 35) | function onStart($serv) {
  function onReceive (line 40) | function onReceive($serv, $fd, $reactor_id, $key)
  function onTask (line 62) | function onTask($serv, $task_id, $reactor_id, $key)
  function onFinish (line 82) | function onFinish($serv, $data)

FILE: examples/server/tcp_client.php
  function send_test3 (line 19) | function send_test3($client, $len)

FILE: examples/server/tcp_server.php
  class SocketServer (line 5) | class SocketServer
    method run (line 11) | function run($host, $port)
    method onReceive (line 24) | function onReceive($serv, $fd, $tid, $data)

FILE: examples/server/trace.php
  function test (line 2) | function test()
  function test_sleep (line 7) | function test_sleep()

FILE: examples/server/zmq.php
  function onZMQR (line 12) | function onZMQR()

FILE: examples/ssl/client.c
  function OpenConnection (line 18) | int OpenConnection(const char *hostname, int port)
  function SSL_CTX (line 45) | SSL_CTX* InitCTX(void)
  function ShowCerts (line 65) | void ShowCerts(SSL* ssl)
  function main (line 86) | int main(int count, char *strings[])

FILE: examples/stdext/array.php
  function odd (line 45) | function odd($var)
  function even (line 51) | function even($var)

FILE: examples/table/set.php
  function child1 (line 12) | function child1($worker)

FILE: examples/task/msg_push.php
  class SwooleTask (line 4) | class SwooleTask
    method __construct (line 9) | function __construct($key, $workerId)
    method dispatch (line 19) | function dispatch($data)

FILE: examples/task/shared_client.php
  function help (line 7) | function help()

FILE: examples/task/shared_server.php
  function my_onStart (line 14) | function my_onStart($serv)
  function my_onShutdown (line 21) | function my_onShutdown($serv)
  function my_onClose (line 26) | function my_onClose($serv, $fd, $reactor_id)
  function my_onConnect (line 31) | function my_onConnect($serv, $fd, $reactor_id)
  function my_onWorkerStart (line 37) | function my_onWorkerStart($serv, $worker_id)
  function my_onWorkerStop (line 49) | function my_onWorkerStop($serv, $worker_id)
  function my_onReceive (line 54) | function my_onReceive(Swoole\Server $serv, $fd, $reactor_id, $rdata)
  function my_onTask (line 82) | function my_onTask(Swoole\Server $serv, $task_id, $reactor_id, $data)
  function my_onFinish (line 115) | function my_onFinish(Swoole\Server $serv, $task_id, $from_worker_id, $data)
  function my_onWorkerError (line 120) | function my_onWorkerError(Swoole\Server $serv, $worker_id, $worker_pid, ...

FILE: examples/timer/after.php
  function timeout (line 2) | function timeout($tm)

FILE: examples/timer/tick.php
  function timeout (line 2) | function timeout($tm)

FILE: examples/tracer/blocking.php
  function sleep_test (line 4) | function  sleep_test()
  function redis_test (line 11) | function redis_test()
  function main (line 22) | function main()

FILE: examples/tracer/cli.php
  class ClassA (line 3) | class ClassA
    method __construct (line 8) | public function __construct()
  function foo (line 15) | function foo(ClassA $obj)

FILE: examples/tracer/co.php
  function sleep_n (line 4) | function sleep_n($time)

FILE: examples/tracer/co_server.php
  class Test (line 23) | class Test
    method run (line 28) | function run()
    method run2 (line 34) | function run2(&$locals)

FILE: examples/tracer/fn_call.php
  function test3 (line 3) | function test3($a, $b)
  function test2 (line 10) | function test2()
  function main (line 18) | function main()
  function test4 (line 27) | function test4()
  class T (line 33) | class T
    method method_test (line 35) | function method_test()

FILE: examples/tracer/gc.php
  class testA (line 6) | class testA
  function foo (line 10) | function foo()

FILE: examples/websocket/server.php
  function user_handshake (line 15) | function user_handshake(Request $request, Response $response)

FILE: ext-src/php_swoole.cc
  function php_swoole_init_globals (line 357) | static void php_swoole_init_globals(zend_swoole_globals *swoole_globals) {
  function php_swoole_register_shutdown_function (line 376) | void php_swoole_register_shutdown_function(const char *function) {
  function php_swoole_set_global_option (line 400) | void php_swoole_set_global_option(HashTable *vht) {
  function SW_API (line 506) | SW_API bool php_swoole_is_enable_coroutine() {
  function SW_API (line 514) | SW_API zend_long php_swoole_parse_to_size(zval *zv) {
  function SW_API (line 529) | SW_API zend_string *php_swoole_serialize(zval *zdata) {
  function SW_API (line 545) | SW_API bool php_swoole_unserialize(const zend_string *data, zval *zv) {
  function fatal_error (line 561) | static void fatal_error(int code, const char *format, ...) {
  function print_backtrace (line 587) | static void print_backtrace() {
  function bug_report_message_init (line 592) | static void bug_report_message_init() {
  function sw_module_number (line 598) | int sw_module_number() {
  function PHP_MINIT_FUNCTION (line 604) | PHP_MINIT_FUNCTION(swoole) {
  function PHP_MSHUTDOWN_FUNCTION (line 1062) | PHP_MSHUTDOWN_FUNCTION(swoole) {
  function PHP_MINFO_FUNCTION (line 1090) | PHP_MINFO_FUNCTION(swoole) {
  function sw_efree (line 1252) | static void sw_efree(void *address) {
  function sw_zend_string_free (line 1280) | static void sw_zend_string_free(void *address) {
  function sw_php_exit (line 1306) | void sw_php_exit(int status) {
  function sw_zval_is_serializable (line 1315) | bool sw_zval_is_serializable(const zval *struc) {
  function sw_after_fork (line 1343) | static void sw_after_fork(void *args) {
  function PHP_RINIT_FUNCTION (line 1352) | PHP_RINIT_FUNCTION(swoole) {
  function PHP_RSHUTDOWN_FUNCTION (line 1416) | PHP_RSHUTDOWN_FUNCTION(swoole) {
  function PHP_FUNCTION (line 1463) | static PHP_FUNCTION(swoole_version) {
  function hashkit_one_at_a_time (line 1467) | static uint32_t hashkit_one_at_a_time(const char *key, size_t key_length) {
  function PHP_FUNCTION (line 1484) | static PHP_FUNCTION(swoole_hashcode) {
  function PHP_FUNCTION (line 1505) | static PHP_FUNCTION(swoole_clear_error) {
  function PHP_FUNCTION (line 1509) | PHP_FUNCTION(swoole_last_error) {
  function PHP_FUNCTION (line 1513) | static PHP_FUNCTION(swoole_cpu_num) {
  function PHP_FUNCTION (line 1517) | static PHP_FUNCTION(swoole_strerror) {
  function PHP_FUNCTION (line 1538) | static PHP_FUNCTION(swoole_error_log) {
  function PHP_FUNCTION (line 1551) | static PHP_FUNCTION(swoole_error_log_ex) {
  function PHP_FUNCTION (line 1565) | static PHP_FUNCTION(swoole_ignore_error) {
  function PHP_FUNCTION (line 1575) | static PHP_FUNCTION(swoole_mime_type_add) {
  function PHP_FUNCTION (line 1587) | static PHP_FUNCTION(swoole_mime_type_set) {
  function PHP_FUNCTION (line 1599) | static PHP_FUNCTION(swoole_mime_type_delete) {
  function PHP_FUNCTION (line 1609) | static PHP_FUNCTION(swoole_mime_type_get) {
  function PHP_FUNCTION (line 1619) | static PHP_FUNCTION(swoole_mime_type_exists) {
  function PHP_FUNCTION (line 1629) | static PHP_FUNCTION(swoole_mime_type_list) {
  function PHP_FUNCTION (line 1636) | static PHP_FUNCTION(swoole_errno) {
  function PHP_FUNCTION (line 1640) | PHP_FUNCTION(swoole_set_process_name) {
  function PHP_FUNCTION (line 1649) | static PHP_FUNCTION(swoole_get_local_ip) {
  function PHP_FUNCTION (line 1694) | static PHP_FUNCTION(swoole_get_local_mac) {
  function PHP_FUNCTION (line 1774) | static PHP_FUNCTION(swoole_internal_call_user_shutdown_begin) {
  function PHP_FUNCTION (line 1784) | static PHP_FUNCTION(swoole_substr_unserialize) {
  function PHP_FUNCTION (line 1816) | static PHP_FUNCTION(swoole_substr_json_decode) {
  function PHP_FUNCTION (line 1868) | static PHP_FUNCTION(swoole_implicit_fn) {

FILE: ext-src/php_swoole_client.h
  type ClientFlag (line 24) | enum ClientFlag {
  type AsyncClientObject (line 30) | struct AsyncClientObject {
  type swoole (line 41) | typedef swoole::network::Client NetClient;
  type ClientObject (line 43) | struct ClientObject {
  function ClientObject (line 52) | static inline ClientObject *php_swoole_client_fetch_object(zend_object *...
  function ClientObject (line 56) | static inline ClientObject *php_swoole_client_fetch_object(const zval *z...
  function NetClient (line 60) | static inline NetClient *php_swoole_client_get_cli(const zval *zobject) {
  function php_swoole_client_get_type (line 64) | static inline enum swSocketType php_swoole_client_get_type(long type) {

FILE: ext-src/php_swoole_coroutine.h
  function SW_EXTERN_C_END (line 42) | SW_EXTERN_C_END
  function namespace (line 48) | namespace swoole {
  function PHPContext (line 175) | static inline PHPContext *get_context() {
  function PHPContext (line 180) | static inline PHPContext *get_origin_context(PHPContext *ctx) {
  function PHPContext (line 185) | static inline PHPContext *get_context_by_cid(long cid) {
  function get_stack_usage (line 189) | static inline ssize_t get_stack_usage(long cid) {
  function get_max_num (line 209) | static inline uint64_t get_max_num() {
  function set_max_num (line 213) | static inline void set_max_num(uint64_t n) {
  function is_schedulable (line 221) | static inline bool is_schedulable(PHPContext *ctx) {
  function enable_scheduler (line 225) | static inline bool enable_scheduler() {
  function disable_scheduler (line 234) | static inline bool disable_scheduler() {
  function get_hook_flags (line 245) | static inline uint32_t get_hook_flags() {
  function enable_preemptive_scheduler (line 249) | static inline void enable_preemptive_scheduler(bool value) {
  function is_activated (line 253) | static inline bool is_activated() {
  function init_main_context (line 261) | static inline void init_main_context() {
  function free_main_context (line 268) | static inline void free_main_context() {
  function record_last_msec (line 308) | static void record_last_msec(PHPContext *ctx) {

FILE: ext-src/php_swoole_curl.h
  function namespace (line 44) | namespace swoole {

FILE: ext-src/php_swoole_cxx.cc
  function zend_refcounted (line 15) | zend_refcounted *sw_get_refcount_ptr(zval *value) {
  type zend (line 20) | namespace zend {
    function known_strings_init (line 21) | void known_strings_init() {
    function known_strings_dtor (line 30) | void known_strings_dtor() {
    function zend_function (line 35) | zend_function *get_function(const zend_array *function_table, const ch...
    function zend_function (line 39) | zend_function *get_function(const char *fname, size_t fname_len) {
    function zend_function (line 43) | zend_function *get_function(const std::string &fname) {
    function zend_function (line 47) | zend_function *get_function(const zend_string *fname) {
    function zend_always_inline (line 51) | static zend_always_inline zval *sw_zend_symtable_str_add(
    function zend_always_inline (line 60) | static zend_always_inline zval *sw_zend_symtable_str_find(
    function zend_always_inline (line 69) | static zend_always_inline zval *sw_zend_symtable_str_update(
    function array_add_or_merge (line 78) | void array_add_or_merge(zval *zarray, const char *key, size_t key_len,...
    type function (line 100) | namespace function {
      function call (line 102) | bool call(zend_fcall_info_cache *fci_cache, uint32_t argc, zval *arg...
      function Variable (line 120) | Variable call(const std::string &func_name, int argc, zval *argv) {

FILE: ext-src/php_swoole_cxx.h
  type sw_zend_known_string_id (line 97) | typedef enum sw_zend_known_string_id {
  type swSocketType (line 133) | enum swSocketType
  type swSocketType (line 134) | enum swSocketType
  type swSocketType (line 137) | enum swSocketType
  function php_swoole_is_fatal_error (line 161) | static inline bool php_swoole_is_fatal_error() {
  function php_swoole_async (line 196) | static inline bool php_swoole_async(bool blocking, const std::function<v...
  function namespace (line 205) | namespace zend {
  function zend_string (line 272) | zend_string *get() const {
  function rtrim (line 276) | void rtrim() const {
  function release (line 292) | void release() {
  function class (line 307) | class KeyValue {
  function add_to (line 321) | void add_to(zval *zarray) {
  function class (line 335) | class ArrayIterator {
  function zval (line 371) | zval *value() const {
  function Bucket (line 375) | Bucket *ptr() const {
  function class (line 408) | class Array {
  function assign (line 544) | void assign(const char *str, size_t len) {
  function assign_tolower (line 549) | void assign_tolower(const char *str, size_t len) {
  function class (line 563) | class Callable {
  function set (line 626) | void set(const KeyT &key, const ValueT &value) {
  function ValueT (line 630) | ValueT get(const KeyT &key) {
  function exists (line 643) | bool exists(const KeyT &key) {
  function del (line 648) | void del(const KeyT &key) {
  function clear (line 652) | void clear() {

FILE: ext-src/php_swoole_http.h
  type swHttpHeaderFlag (line 57) | enum swHttpHeaderFlag {
  type swHttpCompressMethod (line 68) | enum swHttpCompressMethod {
  type swHttpErrorStatusCode (line 76) | enum swHttpErrorStatusCode {
  function namespace (line 83) | namespace swoole {
  function send_end_stream_data_frame (line 337) | bool send_end_stream_data_frame() const;
  function sw_inline (line 416) | static sw_inline bool swoole_http_has_crlf(const char *value, size_t len...

FILE: ext-src/php_swoole_http_server.h
  function http_server_add_server_array (line 50) | static inline void http_server_add_server_array(HashTable *ht, zend_stri...
  function http_server_add_server_array (line 56) | static inline void http_server_add_server_array(HashTable *ht, zend_stri...
  function http_server_add_server_array (line 62) | static inline void http_server_add_server_array(HashTable *ht, zend_stri...
  function http_server_add_server_array (line 68) | static inline void http_server_add_server_array(HashTable *ht, zend_stri...
  function http_server_add_server_array (line 74) | static inline void http_server_add_server_array(HashTable *ht, zend_stri...
  function http_server_add_server_array (line 80) | static inline void http_server_add_server_array(HashTable *ht, zend_stri...
  function http_server_set_object_fd_property (line 84) | static inline void http_server_set_object_fd_property(zend_object *objec...

FILE: ext-src/php_swoole_library.h
  type zval (line 23) | typedef zval zend_source_string_t;
  type zend_string (line 25) | typedef zend_string zend_source_string_t;
  function zend_op_array (line 45) | static inline zend_op_array *_compile_string(zend_source_string_t *sourc...
  function zend_bool (line 55) | static inline zend_bool _eval(const char *code, const char *filename) {
  function php_swoole_load_library (line 11318) | void php_swoole_load_library()

FILE: ext-src/php_swoole_private.h
  type php_swoole_fd_type (line 141) | enum php_swoole_fd_type {
  type php_swoole_req_status (line 155) | enum php_swoole_req_status {
  type php_swoole_hook_type (line 163) | enum php_swoole_hook_type {
  type php_stream_size_t (line 385) | typedef ssize_t php_stream_size_t;
  type zend_string (line 386) | typedef zend_string error_filename_t;
  function sw_inline (line 401) | static sw_inline zend_bool ZVAL_IS_TRUE(const zval *v) {
  function sw_inline (line 405) | static sw_inline zend_bool ZVAL_IS_FALSE(const zval *v) {
  function sw_inline (line 409) | static sw_inline zend_bool ZVAL_IS_BOOL(const zval *v) {
  function sw_inline (line 413) | static sw_inline zend_bool ZVAL_IS_UNDEF(const zval *v) {
  function sw_inline (line 417) | static sw_inline zend_bool ZVAL_IS_LONG(const zval *v) {
  function sw_inline (line 421) | static sw_inline zend_bool ZVAL_IS_STRING(const zval *v) {
  function sw_inline (line 425) | static sw_inline zend_bool ZVAL_IS_EMPTY_STRING(const zval *v) {
  function sw_inline (line 429) | static sw_inline zend_bool Z_BVAL_P(const zval *v) {
  function sw_inline (line 433) | static sw_inline zend_bool ZVAL_IS_ARRAY(const zval *v) {
  function sw_inline (line 437) | static sw_inline zend_bool ZVAL_IS_REF(const zval *v) {
  function sw_inline (line 441) | static sw_inline zend_bool ZVAL_IS_OBJECT(const zval *v) {
  function sw_inline (line 445) | static sw_inline zval *sw_malloc_zval() {
  function sw_inline (line 449) | static sw_inline zval *sw_zval_dup(zval *val) {
  function sw_inline (line 455) | static sw_inline void sw_zval_free(zval *val) {
  function sw_zval_is_php_socket (line 461) | static inline bool sw_zval_is_php_socket(zval *val) {
  function sw_zval_is_co_socket (line 466) | static inline bool sw_zval_is_co_socket(zval *val) {
  function sw_zval_is_client (line 470) | static inline bool sw_zval_is_client(zval *val) {
  function sw_zval_is_process (line 474) | static inline bool sw_zval_is_process(zval *val) {
  function sw_is_main_thread (line 480) | static inline bool sw_is_main_thread() {
  function sw_active_thread_count (line 493) | static inline size_t sw_active_thread_count() {
  function sw_inline (line 534) | static sw_inline zend_string *sw_zend_string_recycle(zend_string *s, siz...
  function sw_inline (line 553) | static sw_inline int php_swoole_array_length_safe(zval *zarray) {
  function sw_inline (line 583) | static sw_inline void add_assoc_ulong_safe_ex(zval *arg, const char *key...
  function sw_inline (line 593) | static sw_inline void add_assoc_ulong_safe(zval *arg, const char *key, z...
  function sw_inline (line 678) | static sw_inline int sw_zend_register_function_alias(zend_array *origin_...
  function sw_inline (line 704) | static sw_inline int sw_zend_register_class_alias(const char *name, size...
  function sw_inline (line 719) | static sw_inline zend_object *sw_zend_create_object(zend_class_entry *ce...
  function sw_inline (line 727) | static sw_inline zend_object *sw_zend_create_object_deny(zend_class_entr...
  function sw_inline (line 742) | static sw_inline void sw_zend_class_unset_property_deny(zend_object *obj...
  function sw_inline (line 756) | static sw_inline zval *sw_zend_read_property(zend_class_entry *ce, zval ...
  function sw_inline (line 765) | static sw_inline void sw_zend_update_property_null_ex(zend_class_entry *...
  function sw_inline (line 772) | static sw_inline zval *sw_zend_read_property_ex(zend_class_entry *ce, zv...
  function sw_inline (line 782) | static sw_inline zval *sw_zend_read_property_not_null(
  function sw_inline (line 789) | static sw_inline zval *sw_zend_read_property_not_null_ex(zend_class_entr...
  function sw_inline (line 795) | static sw_inline zval *sw_zend_update_and_read_property_array(zend_class...
  function sw_inline (line 806) | static sw_inline zval *sw_zend_read_and_convert_property_array(
  function sw_inline (line 846) | static sw_inline int sw_zend_function_max_num_args(zend_function *functi...
  function sw_inline (line 853) | static sw_inline zend_bool sw_zend_is_callable(zval *callable, int check...
  function sw_inline (line 861) | static sw_inline zend_bool sw_zend_is_callable_at_frame(zval *zcallable,
  function sw_inline (line 882) | static sw_inline zend_bool sw_zend_is_callable_ex(zval *zcallable,
  function sw_inline (line 894) | static sw_inline int sw_zend_call_function_ex(
  function sw_inline (line 923) | static sw_inline int sw_zend_call_function_ex2(
  function sw_inline (line 932) | static sw_inline int sw_zend_call_function_anyway(zend_fcall_info *fci, ...
  function sw_inline (line 944) | static sw_inline void sw_zend_fci_params_persist(zend_fcall_info *fci) {
  function sw_inline (line 954) | static sw_inline void sw_zend_fci_params_discard(zend_fcall_info *fci) {
  function sw_inline (line 963) | static sw_inline void sw_zend_fci_cache_persist(zend_fcall_info_cache *f...
  function sw_inline (line 972) | static sw_inline void sw_zend_fci_cache_discard(zend_fcall_info_cache *f...
  function sw_inline (line 985) | static sw_inline int php_swoole_check_reactor() {
  function sw_inline (line 996) | static sw_inline char *php_swoole_url_encode(const char *value, size_t v...
  function sw_inline (line 1004) | static sw_inline char *php_swoole_http_build_query(zval *zdata, size_t *...

FILE: ext-src/php_swoole_process.h
  type PipeType (line 23) | enum PipeType {

FILE: ext-src/php_swoole_server.h
  type php_swoole_server_callback_type (line 29) | enum php_swoole_server_callback_type {
  type php_swoole_server_port_callback_type (line 46) | enum php_swoole_server_port_callback_type {
  function namespace (line 64) | namespace swoole {
  type ServerPortProperty (line 75) | struct ServerPortProperty {
  type ServerProperty (line 82) | struct ServerProperty {
  function isset_callback (line 92) | struct ServerObject {
  function isset_callback (line 107) | bool isset_callback(int event_type) const {
  type TaskCo (line 132) | struct TaskCo {

FILE: ext-src/php_swoole_ssh2.h
  type php_ssh2_session_data (line 10) | typedef struct _php_ssh2_session_data {
  function swoole (line 20) | static inline swoole::EventType ssh2_get_event_type(LIBSSH2_SESSION *ses...
  function SocketImpl (line 29) | static inline SocketImpl *ssh2_get_socket(LIBSSH2_SESSION *session) {
  function ssh2_set_socket_timeout (line 34) | static inline void ssh2_set_socket_timeout(LIBSSH2_SESSION *session, int...
  function class (line 39) | class ResourceGuard {

FILE: ext-src/php_swoole_thread.h
  type ThreadResourceId (line 25) | typedef uint32_t ThreadResourceId;
  function class (line 81) | class ThreadResource {
  function setKey (line 103) | struct ArrayItem {
  function setKey (line 127) | void setKey(const zend_string *_key) {
  function class (line 148) | class ZendArray : public ThreadResource {

FILE: ext-src/php_swoole_websocket.h
  function namespace (line 27) | namespace swoole {

FILE: ext-src/stubs/php_swoole.stub.php
  function swoole_version (line 3) | function swoole_version(): string
  function swoole_cpu_num (line 7) | function swoole_cpu_num(): int
  function swoole_last_error (line 11) | function swoole_last_error(): int
  function swoole_async_dns_lookup_coro (line 15) | function swoole_async_dns_lookup_coro(string $domain_name, float $timeou...
  function swoole_async_set (line 19) | function swoole_async_set(array $settings): bool
  function swoole_coroutine_create (line 23) | function swoole_coroutine_create(callable $func, mixed ...$params): int|...
  function swoole_coroutine_defer (line 27) | function swoole_coroutine_defer(callable $callback): void
  function swoole_coroutine_socketpair (line 31) | function swoole_coroutine_socketpair(int $domain, int $type, int $protoc...
  function swoole_test_kernel_coroutine (line 35) | function swoole_test_kernel_coroutine(int $count = 100, float $sleep_tim...
  function swoole_client_select (line 39) | function swoole_client_select(?array &$read, ?array &$write, ?array &$ex...
  function swoole_set_process_name (line 43) | function swoole_set_process_name(string $process_name): bool
  function swoole_get_local_ip (line 47) | function swoole_get_local_ip(int $family = 2): array
  function swoole_get_local_mac (line 51) | function swoole_get_local_mac(): array
  function swoole_strerror (line 55) | function swoole_strerror(int $errno, int $error_type = SWOOLE_STRERROR_S...
  function swoole_errno (line 59) | function swoole_errno(): int
  function swoole_clear_error (line 63) | function swoole_clear_error(): void
  function swoole_error_log (line 67) | function swoole_error_log(int $level, string $msg): void
  function swoole_error_log_ex (line 71) | function swoole_error_log_ex(int $level, int $error, string $msg): void
  function swoole_ignore_error (line 75) | function swoole_ignore_error(int $error): void
  function swoole_hashcode (line 79) | function swoole_hashcode(string $data, int $type = 0): false|int
  function swoole_mime_type_add (line 83) | function swoole_mime_type_add(string $suffix, string $mime_type): bool
  function swoole_mime_type_set (line 87) | function swoole_mime_type_set(string $suffix, string $mime_type): void
  function swoole_mime_type_delete (line 91) | function swoole_mime_type_delete(string $suffix): bool
  function swoole_mime_type_get (line 95) | function swoole_mime_type_get(string $filename): string
  function swoole_mime_type_exists (line 99) | function swoole_mime_type_exists(string $filename): bool
  function swoole_mime_type_list (line 103) | function swoole_mime_type_list(): array
  function swoole_clear_dns_cache (line 107) | function swoole_clear_dns_cache(): void
  function swoole_substr_unserialize (line 111) | function swoole_substr_unserialize(string $str, int $offset, int $length...
  function swoole_substr_json_decode (line 115) | function swoole_substr_json_decode(string $str, int $offset, int $length...
  function swoole_internal_call_user_shutdown_begin (line 119) | function swoole_internal_call_user_shutdown_begin(): bool
  function swoole_implicit_fn (line 124) | function swoole_implicit_fn(string $fn, mixed $args = null): mixed

FILE: ext-src/stubs/php_swoole_atomic.stub.php
  class Atomic (line 3) | class Atomic {
    method __construct (line 4) | public function __construct(int $value = 0) {}
    method add (line 5) | public function add(int $add_value = 1): int {}
    method sub (line 6) | public function sub(int $sub_value = 1): int {}
    method get (line 7) | public function get(): int {}
    method set (line 8) | public function set(int $value): void {}
    method cmpset (line 9) | public function cmpset(int $cmp_value, int $new_value): bool {}
    method wait (line 10) | public function wait(float $timeout = 1.0): bool {}
    method wakeup (line 11) | public function wakeup(int $count = 1): bool {}
  class Long (line 16) | class Long {
    method __construct (line 17) | public function __construct(int $value = 0) {}
    method add (line 18) | public function add(int $add_value = 1): int {}
    method sub (line 19) | public function sub(int $sub_value = 1): int {}
    method get (line 20) | public function get(): int {}
    method set (line 21) | public function set(int $value): void {}
    method cmpset (line 22) | public function cmpset(int $cmp_value, int $new_value): bool {}

FILE: ext-src/stubs/php_swoole_channel_coro.stub.php
  class Channel (line 3) | class Channel {
    method __construct (line 4) | public function __construct(int $size = 1) {}
    method push (line 5) | public function push(mixed $data, float $timeout = -1): bool {}
    method pop (line 6) | public function pop(float $timeout = -1): mixed {}
    method stats (line 7) | public function stats(): array {}
    method close (line 8) | public function close(): bool {}
    method length (line 9) | public function length(): int {}
    method isEmpty (line 10) | public function isEmpty(): bool {}
    method isFull (line 11) | public function isFull(): bool {}

FILE: ext-src/stubs/php_swoole_client.stub.php
  class Client (line 3) | class Client {
    method __construct (line 4) | public function __construct(int $type, bool $async = SWOOLE_SOCK_SYNC,...
    method __destruct (line 5) | public function __destruct() {}
    method set (line 6) | public function set(array $settings): bool {}
    method connect (line 7) | public function connect(string $host, int $port = 0, float $timeout = ...
    method recv (line 8) | public function recv(int $size = 65536, int $flag = 0): string|false {}
    method send (line 9) | public function send(string $data, int $flag = 0): false|int {}
    method sendfile (line 10) | public function sendfile(string $filename, int $offset = 0, int $lengt...
    method sendto (line 11) | public function sendto(string $ip, int $port, string $data): bool {}
    method enableSSL (line 12) | public function enableSSL(?callable $onSslReady = null): bool {}
    method getPeerCert (line 13) | public function getPeerCert(): string|bool {}
    method verifyPeerCert (line 14) | public function verifyPeerCert(): bool {}
    method isConnected (line 15) | public function isConnected(): bool {}
    method getsockname (line 16) | public function getsockname(): array|false {}
    method getpeername (line 17) | public function getpeername(): array|false {}
    method close (line 18) | public function close(bool $force = false): bool {}
    method shutdown (line 19) | public function shutdown(int $how): bool {}
    method getSocket (line 21) | public function getSocket(): \Socket|false {}

FILE: ext-src/stubs/php_swoole_client_async.stub.php
  class Client (line 3) | class Client extends \Swoole\Client {
    method __construct (line 4) | public function __construct(int $type) {}
    method __destruct (line 5) | public function __destruct() {}
    method connect (line 6) | public function connect(string $host, int $port = 0, float $timeout = ...
    method on (line 7) | public function on(string $host, callable $callback): bool {}
    method enableSSL (line 8) | public function enableSSL(?callable $onSslReady = null): bool {}
    method isConnected (line 9) | public function isConnected(): bool {}
    method sleep (line 10) | public function sleep(): bool {}
    method wakeup (line 11) | public function wakeup(): bool {}
    method close (line 12) | public function close(bool $force = false): bool {}

FILE: ext-src/stubs/php_swoole_client_coro.stub.php
  class Client (line 3) | class Client {
    method __construct (line 4) | public function __construct(int $type) {}
    method __destruct (line 5) | public function __destruct() {}
    method set (line 6) | public function set(array $settings): bool {}
    method connect (line 7) | public function connect(string $host, int $port = 0, float $timeout = ...
    method recv (line 8) | public function recv(float $timeout = 0): string|false {}
    method peek (line 9) | public function peek(int $length = 65535): string|false {}
    method send (line 10) | public function send(string $data, float $timeout = 0): int|false {}
    method sendfile (line 11) | public function sendfile(string $filename, int $offset = 0, int $lengt...
    method sendto (line 12) | public function sendto(string $address, int $port, string $data): bool {}
    method recvfrom (line 13) | public function recvfrom(int $length, mixed &$address, mixed &$port = ...
    method enableSSL (line 14) | public function enableSSL(): bool {}
    method getPeerCert (line 15) | public function getPeerCert(): false|string {}
    method verifyPeerCert (line 16) | public function verifyPeerCert(bool $allow_self_signed = false): bool {}
    method exportSocket (line 17) | public function exportSocket(): \Swoole\Coroutine\Socket|false {}
    method isConnected (line 18) | public function isConnected(): bool {}
    method getsockname (line 19) | public function getsockname(): array|false {}
    method getpeername (line 20) | public function getpeername(): array|false {}
    method close (line 21) | public function close(): bool {}

FILE: ext-src/stubs/php_swoole_coroutine.stub.php
  class Coroutine (line 3) | class Coroutine {
    method create (line 4) | public static function create(callable $func, mixed ...$param): int|fa...
    method defer (line 5) | public static function defer(callable $callback): void {}
    method set (line 6) | public static function set(array $options): void {}
    method getOptions (line 7) | public static function getOptions(): ?array {}
    method exists (line 8) | public static function exists(int $cid): bool {}
    method yield (line 9) | public static function yield(): bool {}
    method cancel (line 10) | public static function cancel(int $cid, bool $throw_exception = false)...
    method join (line 11) | public static function join(array $cid_array, float $timeout = -1): bo...
    method isCanceled (line 12) | public static function isCanceled(): bool {}
    method suspend (line 13) | public static function suspend(): bool {}
    method resume (line 14) | public static function resume(int $cid): bool {}
    method stats (line 15) | public static function stats(): array {}
    method getCid (line 16) | public static function getCid(): int {}
    method getuid (line 17) | public static function getuid(): int {}
    method getPcid (line 18) | public static function getPcid(int $cid = 0): false|int {}
    method getContext (line 19) | public static function getContext(int $cid = 0): \Swoole\Coroutine\Con...
    method getBackTrace (line 20) | public static function getBackTrace(int $cid = 0, int $options = DEBUG...
    method printBackTrace (line 21) | public static function printBackTrace(int $cid = 0, int $options = 0, ...
    method getElapsed (line 22) | public static function getElapsed(int $cid = 0): int {}
    method getStackUsage (line 23) | public static function getStackUsage(int $cid = 0): false|int {}
    method list (line 24) | public static function list(): \Swoole\Coroutine\Iterator {}
    method listCoroutines (line 25) | public static function listCoroutines(): \Swoole\Coroutine\Iterator {}
    method enableScheduler (line 26) | public static function enableScheduler(): bool {}
    method disableScheduler (line 27) | public static function disableScheduler(): bool {}
    method getExecuteTime (line 28) | public static function getExecuteTime(): int {}
    method setTimeLimit (line 29) | public static function setTimeLimit(float $timeout): bool {}
  class ExitException (line 32) | class ExitException {
    method getFlags (line 33) | public function getFlags(): int {}
    method getStatus (line 34) | public function getStatus(): mixed {}

FILE: ext-src/stubs/php_swoole_coroutine_lock.stub.php
  class Lock (line 3) | class Lock {
    method __construct (line 4) | public function __construct(bool $shared = false) {}
    method lock (line 5) | public function lock(int $operation = LOCK_EX): bool {}
    method unlock (line 6) | public function unlock(): bool {}

FILE: ext-src/stubs/php_swoole_coroutine_scheduler.stub.php
  class Scheduler (line 3) | class Scheduler {
    method add (line 4) | public function add(callable $func, mixed ...$param): void {}
    method parallel (line 5) | public function parallel(int $n, callable $func, mixed ...$param): voi...
    method set (line 6) | public function set(array $settings): void {}
    method getOptions (line 7) | public function getOptions(): ?array {}
    method start (line 8) | public function start(): bool {}

FILE: ext-src/stubs/php_swoole_coroutine_system.stub.php
  class System (line 3) | class System {
    method gethostbyname (line 4) | public static function gethostbyname(string $domain_name, int $type = ...
    method dnsLookup (line 5) | public static function dnsLookup(string $domain_name, float $timeout =...
    method exec (line 6) | public static function exec(string $command, bool $get_error_stream = ...
    method sleep (line 7) | public static function sleep(float $seconds): bool {}
    method getaddrinfo (line 8) | public static function getaddrinfo(string $domain, int $family = AF_IN...
    method statvfs (line 9) | public static function statvfs(string $path): array {}
    method readFile (line 10) | public static function readFile(string $filename, int $flag = 0): fals...
    method writeFile (line 11) | public static function writeFile(string $filename, string $fileContent...
    method wait (line 12) | public static function wait(float $timeout = -1): array|false {}
    method waitPid (line 13) | public static function waitPid(int $pid, float $timeout = -1): array|f...
    method waitSignal (line 14) | public static function waitSignal(int|array $signals, float $timeout =...
    method waitEvent (line 15) | public static function waitEvent(mixed $socket, int $events = SWOOLE_E...

FILE: ext-src/stubs/php_swoole_event.stub.php
  function swoole_event_add (line 2) | function swoole_event_add(mixed $fd, ?callable $read_callback = null, ?c...
  function swoole_event_set (line 4) | function swoole_event_set(mixed $fd, ?callable $read_callback = null, ?c...
  function swoole_event_del (line 6) | function swoole_event_del(mixed $fd): bool {}
  function swoole_event_write (line 8) | function swoole_event_write(mixed $fd, string $data): bool {}
  function swoole_event_wait (line 10) | function swoole_event_wait(): void {}
  function swoole_event_rshutdown (line 12) | function swoole_event_rshutdown(): void {}
  function swoole_event_exit (line 14) | function swoole_event_exit(): void {}
  function swoole_event_defer (line 16) | function swoole_event_defer(callable $callback): bool {}
  function swoole_event_cycle (line 18) | function swoole_event_cycle(?callable $callback, bool $before = false): ...
  function swoole_event_dispatch (line 20) | function swoole_event_dispatch(): bool {}
  function swoole_event_isset (line 22) | function swoole_event_isset(mixed $fd, int $events = SWOOLE_EVENT_READ |...

FILE: ext-src/stubs/php_swoole_ex.stub.php
  function swoole_get_objects (line 5) | function swoole_get_objects(): false|array
  function swoole_get_vm_status (line 9) | function swoole_get_vm_status(): array
  function swoole_get_object_by_handle (line 13) | function swoole_get_object_by_handle(int $handle): false|object
  function swoole_name_resolver_lookup (line 17) | function swoole_name_resolver_lookup(string $name, Swoole\NameResolver\C...
  function swoole_name_resolver_add (line 21) | function swoole_name_resolver_add(Swoole\NameResolver $ns) : bool
  function swoole_name_resolver_remove (line 25) | function swoole_name_resolver_remove(Swoole\NameResolver $ns) : bool

FILE: ext-src/stubs/php_swoole_ftp.stub.php
  function ftp_connect (line 60) | function ftp_connect(string $hostname, int $port = 21, int $timeout = 90...
  function ftp_ssl_connect (line 63) | function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout ...
  function ftp_login (line 66) | function ftp_login(FTP\Connection $ftp, string $username, #[\SensitivePa...
  function ftp_pwd (line 67) | function ftp_pwd(FTP\Connection $ftp): string|false {}
  function ftp_cdup (line 68) | function ftp_cdup(FTP\Connection $ftp): bool {}
  function ftp_chdir (line 69) | function ftp_chdir(FTP\Connection $ftp, string $directory): bool {}
  function ftp_exec (line 70) | function ftp_exec(FTP\Connection $ftp, string $command): bool {}
  function ftp_raw (line 76) | function ftp_raw(FTP\Connection $ftp, string $command): ?array {}
  function ftp_mkdir (line 77) | function ftp_mkdir(FTP\Connection $ftp, string $directory): string|false {}
  function ftp_rmdir (line 78) | function ftp_rmdir(FTP\Connection $ftp, string $directory): bool {}
  function ftp_chmod (line 79) | function ftp_chmod(FTP\Connection $ftp, int $permissions, string $filena...
  function ftp_alloc (line 82) | function ftp_alloc(FTP\Connection $ftp, int $size, &$response = null): b...
  function ftp_nlist (line 88) | function ftp_nlist(FTP\Connection $ftp, string $directory): array|false {}
  function ftp_rawlist (line 94) | function ftp_rawlist(FTP\Connection $ftp, string $directory, bool $recur...
  function ftp_mlsd (line 100) | function ftp_mlsd(FTP\Connection $ftp, string $directory): array|false {}
  function ftp_systype (line 102) | function ftp_systype(FTP\Connection $ftp): string|false {}
  function ftp_fget (line 105) | function ftp_fget(FTP\Connection $ftp, $stream, string $remote_filename,...
  function ftp_nb_fget (line 108) | function ftp_nb_fget(FTP\Connection $ftp, $stream, string $remote_filena...
  function ftp_pasv (line 109) | function ftp_pasv(FTP\Connection $ftp, bool $enable): bool {}
  function ftp_get (line 110) | function ftp_get(FTP\Connection $ftp, string $local_filename, string $re...
  function ftp_nb_get (line 111) | function ftp_nb_get(FTP\Connection $ftp, string $local_filename, string ...
  function ftp_nb_continue (line 112) | function ftp_nb_continue(FTP\Connection $ftp): int {}
  function ftp_fput (line 115) | function ftp_fput(FTP\Connection $ftp, string $remote_filename, $stream,...
  function ftp_nb_fput (line 118) | function ftp_nb_fput(FTP\Connection $ftp, string $remote_filename, $stre...
  function ftp_put (line 119) | function ftp_put(FTP\Connection $ftp, string $remote_filename, string $l...
  function ftp_append (line 120) | function ftp_append(FTP\Connection $ftp, string $remote_filename, string...
  function ftp_nb_put (line 121) | function ftp_nb_put(FTP\Connection $ftp, string $remote_filename, string...
  function ftp_size (line 122) | function ftp_size(FTP\Connection $ftp, string $filename): int {}
  function ftp_mdtm (line 123) | function ftp_mdtm(FTP\Connection $ftp, string $filename): int {}
  function ftp_rename (line 124) | function ftp_rename(FTP\Connection $ftp, string $from, string $to): bool {}
  function ftp_delete (line 125) | function ftp_delete(FTP\Connection $ftp, string $filename): bool {}
  function ftp_site (line 126) | function ftp_site(FTP\Connection $ftp, string $command): bool {}
  function ftp_close (line 127) | function ftp_close(FTP\Connection $ftp): bool {}
  function ftp_quit (line 130) | function ftp_quit(FTP\Connection $ftp): bool {}
  function ftp_set_option (line 133) | function ftp_set_option(FTP\Connection $ftp, int $option, $value): bool {}
  function ftp_get_option (line 134) | function ftp_get_option(FTP\Connection $ftp, int $option): int|bool {}
  class Connection (line 142) | final class Connection

FILE: ext-src/stubs/php_swoole_http2_client_coro.stub.php
  class Client (line 3) | class Client {
    method __construct (line 4) | public function __construct(string $host, int $port = 80, bool $open_s...
    method __destruct (line 5) | public function __destruct() {}
    method set (line 6) | public function set(array $settings): bool {}
    method connect (line 7) | public function connect(): bool {}
    method stats (line 8) | public function stats(string $key = ''): array|int {}
    method isStreamExist (line 9) | public function isStreamExist(int $stream_id): bool {}
    method send (line 10) | public function send(\Swoole\Http2\Request $request): int|false {}
    method write (line 11) | public function write(int $stream_id, mixed $data, bool $end_stream = ...
    method recv (line 12) | public function recv(float $timeout = 0): \Swoole\Http2\Response|false {}
    method read (line 13) | public function read(float $timeout = 0): \Swoole\Http2\Response|false {}
    method ping (line 14) | public function ping(): bool {}
    method goaway (line 15) | public function goaway(int $error_code = SWOOLE_HTTP2_ERROR_NO_ERROR, ...
    method close (line 16) | public function close(): bool {}

FILE: ext-src/stubs/php_swoole_http_client_coro.stub.php
  class Client (line 12) | class Client
    method __construct (line 14) | public function __construct(string $host, int $port = 0, bool $ssl = f...
    method __destruct (line 16) | public function __destruct() {}
    method set (line 18) | public function set(array $settings): bool {}
    method getDefer (line 20) | public function getDefer(): bool {}
    method setDefer (line 22) | public function setDefer(bool $defer = true): bool {}
    method setMethod (line 24) | public function setMethod(string $method): bool {}
    method setHeaders (line 26) | public function setHeaders(array $headers): bool {}
    method setBasicAuth (line 28) | public function setBasicAuth(string $username, #[\SensitiveParameter] ...
    method setCookies (line 30) | public function setCookies(array $cookies): bool {}
    method setData (line 32) | public function setData(array|string $data): bool {}
    method addFile (line 34) | public function addFile(string $path, string $name, ?string $type = nu...
    method addData (line 36) | public function addData(string $path, string $name, ?string $type = nu...
    method execute (line 38) | public function execute(string $path): bool {}
    method getsockname (line 40) | public function getsockname(): array|false {}
    method getpeername (line 42) | public function getpeername(): array|false {}
    method get (line 44) | public function get(string $path): bool {}
    method post (line 46) | public function post(string $path, mixed $data): bool {}
    method download (line 48) | public function download(string $path, string $file, int $offset = 0):...
    method getBody (line 50) | public function getBody(): false|string {}
    method getHeaders (line 52) | public function getHeaders(): null|array|false {}
    method getCookies (line 54) | public function getCookies(): null|array|false {}
    method getStatusCode (line 56) | public function getStatusCode(): false|int {}
    method getHeaderOut (line 58) | public function getHeaderOut(): false|string {}
    method getPeerCert (line 60) | public function getPeerCert(): false|string {}
    method upgrade (line 62) | public function upgrade(string $path): bool {}
    method push (line 64) | public function push(mixed $data, int $opcode = SWOOLE_WEBSOCKET_OPCOD...
    method recv (line 66) | public function recv(float $timeout = 0): bool|\Swoole\WebSocket\Frame...
    method close (line 68) | public function close(): bool {}
    method ping (line 70) | public function ping(string $data = ""): bool {}
    method disconnect (line 72) | public function disconnect(int $code = SWOOLE_WEBSOCKET_CLOSE_NORMAL, ...

FILE: ext-src/stubs/php_swoole_http_cookie.stub.php
  class Cookie (line 3) | class Cookie {
    method __construct (line 4) | public function __construct(bool $encode = true) {}
    method withName (line 5) | public function withName(string $name): \Swoole\Http\Cookie {}
    method withValue (line 6) | public function withValue(string $value = ''): \Swoole\Http\Cookie {}
    method withExpires (line 7) | public function withExpires(int $expires = 0): \Swoole\Http\Cookie {}
    method withPath (line 8) | public function withPath(string $path = '/'): \Swoole\Http\Cookie {}
    method withDomain (line 9) | public function withDomain(string $domain = ''): \Swoole\Http\Cookie {}
    method withSecure (line 10) | public function withSecure(bool $secure = false): \Swoole\Http\Cookie {}
    method withHttpOnly (line 11) | public function withHttpOnly(bool $httpOnly = false): \Swoole\Http\Coo...
    method withSameSite (line 12) | public function withSameSite(string $sameSite = ''): \Swoole\Http\Cook...
    method withPriority (line 13) | public function withPriority(string $priority = ''): \Swoole\Http\Cook...
    method withPartitioned (line 14) | public function withPartitioned(bool $partitioned = false): \Swoole\Ht...
    method toArray (line 15) | public function toArray(): array {}
    method toString (line 16) | public function toString(): string | false {}
    method reset (line 17) | public function reset(): void {}

FILE: ext-src/stubs/php_swoole_http_request.stub.php
  class Request (line 3) | class Request {
    method __destruct (line 4) | public function __destruct() {}
    method getData (line 5) | public function getData(): string|false {}
    method create (line 6) | public static function create(array $options = []): Request {}
    method parse (line 7) | public function parse(string $data): int|false {}
    method isCompleted (line 8) | public function isCompleted(): bool {}
    method getMethod (line 9) | public function getMethod(): string|false {}
    method getContent (line 10) | public function getContent(): string|false {}

FILE: ext-src/stubs/php_swoole_http_response.stub.php
  class Response (line 3) | class Response {
    method write (line 4) | public function write(string $content): bool {}
    method end (line 5) | public function end(?string $content = null): bool {}
    method sendfile (line 6) | public function sendfile(string $filename, int $offset = 0, int $lengt...
    method redirect (line 7) | public function redirect(string $location, int $http_code = 302): bool {}
    method cookie (line 8) | public function cookie(\Swoole\Http\Cookie|string $name_or_object , st...
    method rawcookie (line 9) | public function rawcookie(string $name, string $value = '', int $expir...
    method header (line 10) | public function header(string $key, string|array $value, bool $format ...
    method initHeader (line 11) | public function initHeader(): bool {}
    method isWritable (line 12) | public function isWritable(): bool {}
    method detach (line 13) | public function detach(): bool {}
    method create (line 14) | public static function create(object|array|int $server = -1, int $fd =...
    method upgrade (line 15) | public function upgrade(): bool {}
    method push (line 16) | public function push(\Swoole\WebSocket\Frame|string $data, int $opcode...
    method recv (line 17) | public function recv(float $timeout = 0): \Swoole\WebSocket\Frame|fals...
    method close (line 18) | public function close(): bool {}
    method trailer (line 19) | public function trailer(string $key, string $value): bool {}
    method ping (line 20) | public function ping(string $data = ''): bool {}
    method goaway (line 21) | public function goaway(int $error_code = SWOOLE_HTTP2_ERROR_NO_ERROR, ...
    method status (line 22) | public function status(int $http_code, string $reason = ''): bool {}
    method disconnect (line 23) | public function disconnect(int $code = SWOOLE_WEBSOCKET_CLOSE_NORMAL, ...
    method __destruct (line 24) | public function __destruct() {}

FILE: ext-src/stubs/php_swoole_http_server_coro.stub.php
  class Server (line 3) | final class Server {
    method __construct (line 4) | public function __construct(string $host, int $port = 0, bool $ssl = f...
    method __destruct (line 5) | public function __destruct() {}
    method set (line 6) | public function set(array $settings): bool {}
    method handle (line 7) | public function handle(string $pattern, callable $callback): bool {}
    method start (line 8) | public function start(): bool {}
    method shutdown (line 9) | public function shutdown(): void {}
    method onAccept (line 10) | private function onAccept(\Swoole\Coroutine\Socket $conn): void {}

FILE: ext-src/stubs/php_swoole_lock.stub.php
  class Lock (line 3) | class Lock {
    method __construct (line 4) | public function __construct(int $type = SWOOLE_MUTEX) {}
    method lock (line 5) | public function lock(int $operation = LOCK_EX, float $timeout = -1): b...
    method unlock (line 6) | public function unlock(): bool {}

FILE: ext-src/stubs/php_swoole_name_resolver.stub.php
  class Context (line 6) | class Context {
    method __construct (line 7) | public function __construct(int $family = AF_INET, bool $withPort = fa...

FILE: ext-src/stubs/php_swoole_process.stub.php
  class Process (line 3) | class Process {
    method __construct (line 4) | public function __construct(callable $callback, bool $redirect_stdin_a...
    method __destruct (line 5) | public function __destruct() {}
    method useQueue (line 6) | public function useQueue(int $key = 0, int $mode = 2, int $capacity = ...
    method statQueue (line 7) | public function statQueue(): array|false {}
    method freeQueue (line 8) | public function freeQueue(): bool {}
    method pop (line 9) | public function pop(int $size = 65536): string|false {}
    method push (line 10) | public function push(string $data): bool {}
    method kill (line 11) | public static function kill(int $pid, int $signal_no = SIGTERM): bool {}
    method signal (line 12) | public static function signal(int $signal_no, ?callable $callback = nu...
    method alarm (line 13) | public static function alarm(int $usec, int $type = 0): bool {}
    method wait (line 14) | public static function wait(bool $blocking = true): array|false {}
    method daemon (line 15) | public static function daemon(bool $nochdir = true, bool $noclose = tr...
    method setAffinity (line 17) | public static function setAffinity(array $cpu_settings): bool {}
    method getAffinity (line 18) | public static function getAffinity(): array {}
    method set (line 20) | public function set(array $settings): void {}
    method setTimeout (line 21) | public function setTimeout(float $seconds): bool {}
    method setBlocking (line 22) | public function setBlocking(bool $blocking): bool {}
    method setPriority (line 23) | public function setPriority(int $which, int $priority, ?int $who = nul...
    method getPriority (line 24) | public function getPriority(int $which, ?int $who = null): int | false {}
    method start (line 25) | public function start(): bool|int {}
    method write (line 26) | public function write(string $data): false|int {}
    method read (line 27) | public function read(int $size = 8192): false|string {}
    method close (line 28) | public function close(int $which = 0): bool {}
    method exit (line 29) | public function exit(int $exit_code = 0): void {}
    method exec (line 30) | public function exec(string $exec_file, array $args): bool {}
    method exportSocket (line 31) | public function exportSocket(): \Swoole\Coroutine\Socket|false {}
    method name (line 32) | public function name(string $process_name): bool {}

FILE: ext-src/stubs/php_swoole_process_pool.stub.php
  class Pool (line 3) | class Pool {
    method __construct (line 4) | public function __construct(int $worker_num, int $ipc_type = SWOOLE_IP...
    method __destruct (line 5) | public function __destruct() {}
    method set (line 6) | public function set(array $settings): void {}
    method on (line 7) | public function on(string $name, callable $callback): bool {}
    method getProcess (line 8) | public function getProcess(int $work_id = -1): \Swoole\Process|false {}
    method listen (line 9) | public function listen(string $host, int $port = 0, int $backlog = 204...
    method write (line 10) | public function write(string $data): bool {}
    method sendMessage (line 11) | public function sendMessage(string $data, int $dst_worker_id): bool {}
    method detach (line 12) | public function detach(): bool {}
    method start (line 13) | public function start(): null|false {}
    method stop (line 14) | public function stop(): void {}
    method shutdown (line 15) | public function shutdown(): bool {}

FILE: ext-src/stubs/php_swoole_redis_server.stub.php
  class Server (line 3) | class Server {
    method setHandler (line 4) | public function setHandler(string $command, callable $callback): bool {}
    method getHandler (line 5) | public function getHandler(string $command): \Closure {}
    method format (line 6) | public static function format(int $type, mixed $value = null): false|s...

FILE: ext-src/stubs/php_swoole_runtime.stub.php
  class Runtime (line 3) | class Runtime {
    method enableCoroutine (line 4) | public static function enableCoroutine(int $flags = SWOOLE_HOOK_ALL): ...
    method getHookFlags (line 5) | public static function getHookFlags(): int {}
    method setHookFlags (line 6) | public static function setHookFlags(int $flags): bool {}

FILE: ext-src/stubs/php_swoole_server.stub.php
  class Server (line 3) | final class Server {
    method __construct (line 4) | public function __construct(string $host = '0.0.0.0', int $port = 0, i...
    method __destruct (line 5) | public function __destruct() {}
    method set (line 6) | public function set(array $settings): bool {}
    method on (line 7) | public function on(string $event_name, callable $callback): bool {}
    method getCallback (line 8) | public function getCallback(string $event_name): \Closure|string|null|...
    method listen (line 9) | public function listen(string $host, int $port, int $sock_type): false...
    method sendMessage (line 10) | public function sendMessage(mixed $message, int $dst_worker_id): bool {}
    method addProcess (line 11) | public function addProcess(\Swoole\Process $process): int|false {}
    method addCommand (line 12) | public function addCommand(string $name, int $accepted_process_types, ...
    method start (line 13) | public function start(): bool {}
    method stop (line 14) | public function stop(int $workerId = -1): bool {}
    method send (line 15) | public function send(int|string $fd, string $send_data, int $serverSoc...
    method sendfile (line 16) | public function sendfile(int $conn_fd, string $filename, int $offset =...
    method stats (line 17) | public function stats(): array {}
    method bind (line 18) | public function bind(int $fd, int $uid): bool {}
    method sendto (line 19) | public function sendto(string $ip, int $port, string $send_data, int $...
    method sendwait (line 20) | public function sendwait(int $conn_fd, string $send_data): bool {}
    method exists (line 21) | public function exists(int $fd): bool {}
    method protect (line 22) | public function protect(int $fd, bool $is_protected = true): bool {}
    method close (line 23) | public function close(int $fd, bool $reset = false): bool {}
    method pause (line 24) | public function pause(int $fd): bool {}
    method resume (line 25) | public function resume(int $fd): bool {}
    method task (line 26) | public function task(mixed $data, int $taskWorkerIndex = -1, ?callable...
    method taskwait (line 27) | public function taskwait(mixed $data, float $timeout = 0.5, int $taskW...
    method taskWaitMulti (line 28) | public function taskWaitMulti(array $tasks, float $timeout = 0.5): fal...
    method taskCo (line 29) | public function taskCo(array $tasks, float $timeout = 0.5): array|fals...
    method finish (line 30) | public function finish(mixed $data): bool {}
    method reload (line 31) | public function reload(bool $only_reload_taskworker = false): bool {}
    method shutdown (line 32) | public function shutdown(): bool {}
    method heartbeat (line 33) | public function heartbeat(bool $ifCloseConnection = true): false|array {}
    method command (line 34) | public function command(string $name, int $process_id, int $process_ty...
    method getClientList (line 35) | public function getClientList(int $start_fd = 0, int $find_count = 10)...
    method getClientInfo (line 36) | public function getClientInfo(int $fd, int $reactor_id = -1, bool $ign...
    method getWorkerId (line 37) | public function getWorkerId(): int|false {}
    method getWorkerPid (line 38) | public function getWorkerPid(int $worker_id = -1): int|false {}
    method getWorkerStatus (line 39) | public function getWorkerStatus(int $worker_id = -1): int|false {}
    method getManagerPid (line 40) | public function getManagerPid(): int {}
    method getMasterPid (line 41) | public function getMasterPid(): int {}
    method getSocket (line 43) | public function getSocket(int $port = 0): false|\Socket {}
    method getLastError (line 45) | public function getLastError(): int {}
  class Iterator (line 50) | final class Iterator {
    method __construct (line 51) | public function __construct() {}
    method __destruct (line 52) | public function __destruct() {}
    method rewind (line 53) | public function rewind(): void {}
    method next (line 54) | public function next(): void {}
    method current (line 55) | public function current(): mixed {}
    method key (line 56) | public function key(): mixed {}
    method valid (line 57) | public function valid(): bool {}
    method count (line 58) | public function count(): int {}
    method offsetExists (line 59) | public function offsetExists(mixed $fd): bool {}
    method offsetGet (line 60) | public function offsetGet(mixed $fd): mixed {}
    method offsetSet (line 61) | public function offsetSet(mixed $fd, mixed $value): void {}
    method offsetUnset (line 62) | public function offsetUnset(mixed $fd): void {}
  class Task (line 67) | final class Task {
    method finish (line 68) | public function finish(mixed $data): bool {}
    method pack (line 69) | public static function pack(mixed $data): string|false {}
    method unpack (line 70) | public static function unpack(string $data): mixed {}

FILE: ext-src/stubs/php_swoole_server_port.stub.php
  class Port (line 3) | class Port {
    method __construct (line 4) | private function __construct() {}
    method __destruct (line 5) | public function __destruct() {}
    method set (line 6) | public function set(array $settings): void {}
    method on (line 7) | public function on(string $event_name, callable $callback): bool {}
    method getCallback (line 8) | public function getCallback(string $event_name): \Closure|null {}
    method getSocket (line 10) | public function getSocket(): \Socket|false {}

FILE: ext-src/stubs/php_swoole_socket_coro.stub.php
  class Socket (line 3) | class Socket {
    method __construct (line 4) | public function __construct(int $domain, int $type, int $protocol = IP...
    method bind (line 5) | public function bind(string $address,int $port = 0): bool {}
    method listen (line 6) | public function listen(int $backlog = 512): bool {}
    method accept (line 7) | public function accept(float $timeout = 0): Socket|false {}
    method connect (line 8) | public function connect(string $host, int $port = 0, float $timeout = ...
    method checkLiveness (line 9) | public function checkLiveness(): bool {}
    method getBoundCid (line 10) | public function getBoundCid(int $event): int {}
    method peek (line 11) | public function peek(int $length = 65536): string|false {}
    method recv (line 12) | public function recv(int $length = 65536, float $timeout = 0): string|...
    method send (line 13) | public function send(string $data, float $timeout = 0): int|false {}
    method readVector (line 14) | public function readVector(array $io_vector, float $timeout = 0): fals...
    method readVectorAll (line 15) | public function readVectorAll(array $io_vector, float $timeout = 0): f...
    method writeVector (line 16) | public function writeVector(array $io_vector, float $timeout = 0): fal...
    method writeVectorAll (line 17) | public function writeVectorAll(array $io_vector, float $timeout = 0): ...
    method sendFile (line 18) | public function sendFile(string $file, int $offset = 0, int $length = ...
    method recvAll (line 19) | public function recvAll(int $length = 65536, float $timeout = 0): fals...
    method sendAll (line 20) | public function sendAll(string $data, float $timeout = 0): int|false {}
    method recvPacket (line 21) | public function recvPacket(float $timeout = 0): false|string {}
    method recvLine (line 22) | public function recvLine(int $length = 65536, float $timeout = 0): str...
    method recvWithBuffer (line 23) | public function recvWithBuffer(int $length = 65536, float $timeout = 0...
    method recvfrom (line 24) | public function recvfrom(mixed &$peername, float $timeout = 0): string...
    method sendto (line 25) | public function sendto(string $addr, int $port, string $data): int|fal...
    method getOption (line 26) | public function getOption(int $level, int $opt_name): mixed {}
    method setOption (line 27) | public function setOption(int $level, int $opt_name, mixed $opt_value)...
    method setProtocol (line 28) | public function setProtocol(array $settings): bool {}
    method sslHandshake (line 29) | public function sslHandshake(): bool {}
    method shutdown (line 30) | public function shutdown(int $how = 2): bool {}
    method close (line 31) | public function close(): bool {}
    method cancel (line 32) | public function cancel(int $event = SWOOLE_EVENT_READ): bool {}
    method getsockname (line 33) | public function getsockname(): false|array {}
    method getpeername (line 34) | public function getpeername(): false|array {}
    method isClosed (line 35) | public function isClosed(): bool {}
    method import (line 37) | public static function import($stream) : Socket | false {}

FILE: ext-src/stubs/php_swoole_ssh2.stub.php
  function ssh2_connect (line 18) | function ssh2_connect(string $host, int $port = 22, ?array $methods = nu...
  function ssh2_disconnect (line 25) | function ssh2_disconnect($session): bool {}
  function ssh2_methods_negotiated (line 32) | function ssh2_methods_negotiated($session): array {}
  function ssh2_fingerprint (line 40) | function ssh2_fingerprint($session, int $flags = 0) {}
  function ssh2_auth_none (line 48) | function ssh2_auth_none($session, string $username): bool {}
  function ssh2_auth_password (line 57) | function ssh2_auth_password($session, string $username, string $password...
  function ssh2_auth_pubkey_file (line 68) | function ssh2_auth_pubkey_file($session, string $username, string $pubke...
  function ssh2_auth_pubkey (line 79) | function ssh2_auth_pubkey($session, string $username, string $pubkey, st...
  function ssh2_auth_hostbased_file (line 92) | function ssh2_auth_hostbased_file($session, string $username, string $ho...
  function ssh2_forward_listen (line 102) | function ssh2_forward_listen($session, int $port, string $host = '127.0....
  function ssh2_forward_accept (line 107) | function ssh2_forward_accept(resource $listener, ?string &$host = null, ...
  function ssh2_shell (line 119) | function ssh2_shell($session, string $termtype = 'vanilla', ?array $env ...
  function ssh2_shell_resize (line 128) | function ssh2_shell_resize($session, int $width, int $height): bool {}
  function ssh2_exec (line 141) | function ssh2_exec($session, string $command, bool $pty = false, ?array ...
  function ssh2_tunnel (line 150) | function ssh2_tunnel($session, string $host, int $port) {}
  function ssh2_scp_recv (line 159) | function ssh2_scp_recv($session, string $remote_file, string $local_file...
  function ssh2_scp_send (line 169) | function ssh2_scp_send($session, string $local_file, string $remote_file...
  function ssh2_fetch_stream (line 177) | function ssh2_fetch_stream($channel, int $streamid) {}
  function ssh2_send_eof (line 184) | function ssh2_send_eof($channel): bool {}
  function ssh2_sftp (line 191) | function ssh2_sftp($session) {}
  function ssh2_sftp_rename (line 200) | function ssh2_sftp_rename($sftp, string $from, string $to): bool {}
  function ssh2_sftp_unlink (line 208) | function ssh2_sftp_unlink($sftp, string $filename): bool {}
  function ssh2_sftp_mkdir (line 218) | function ssh2_sftp_mkdir($sftp, string $dirname, int $mode = 0777, bool ...
  function ssh2_sftp_rmdir (line 226) | function ssh2_sftp_rmdir($sftp, string $dirname): bool {}
  function ssh2_sftp_chmod (line 235) | function ssh2_sftp_chmod($sftp, string $filename, int $mode): bool {}
  function ssh2_sftp_stat (line 243) | function ssh2_sftp_stat($sftp, string $path) {}
  function ssh2_sftp_lstat (line 251) | function ssh2_sftp_lstat($sftp, string $path) {}
  function ssh2_sftp_symlink (line 260) | function ssh2_sftp_symlink($sftp, string $target, string $link): bool {}
  function ssh2_sftp_readlink (line 268) | function ssh2_sftp_readlink($sftp, string $link) {}
  function ssh2_sftp_realpath (line 276) | function ssh2_sftp_realpath($sftp, string $filename) {}
  function ssh2_publickey_init (line 283) | function ssh2_publickey_init($session) {}
  function ssh2_publickey_add (line 294) | function ssh2_publickey_add($pkey, string $algoname, string $blob, bool ...
  function ssh2_publickey_remove (line 303) | function ssh2_publickey_remove($pkey, string $algoname, string $blob): b...
  function ssh2_publickey_list (line 310) | function ssh2_publickey_list($pkey) {}
  function ssh2_auth_agent (line 318) | function ssh2_auth_agent($session, string $username): bool {}

FILE: ext-src/stubs/php_swoole_stdext.stub.php
  function swoole_call_array_method (line 10) | function swoole_call_array_method(mixed ...$args): mixed {}
  function swoole_call_string_method (line 12) | function swoole_call_string_method(mixed ...$args): mixed {}
  function swoole_call_stream_method (line 14) | function swoole_call_stream_method(mixed ...$args): mixed {}
  function swoole_array_search (line 16) | function swoole_array_search(array $array, mixed $value, bool $strict = ...
  function swoole_array_contains (line 18) | function swoole_array_contains(array $array, mixed $needle, bool $strict...
  function swoole_array_join (line 20) | function swoole_array_join(array $array, string $separator): string {}
  function swoole_array_key_exists (line 22) | function swoole_array_key_exists(array $array, null|bool|float|int|resou...
  function swoole_array_map (line 24) | function swoole_array_map(array $array, ?callable $callback, array ...$a...
  function swoole_array_is_typed (line 26) | function swoole_array_is_typed(array $array, string $typeDef = ''): bool {}
  function swoole_array_is_empty (line 28) | function swoole_array_is_empty(array $array): bool {}
  function swoole_str_split (line 30) | function swoole_str_split(string $string, string $delimiter, int $limit ...
  function swoole_str_is_empty (line 32) | function swoole_str_is_empty(string $string): bool {}
  function swoole_str_match (line 34) | function swoole_str_match(string $string, string $pattern, int $flags = ...
  function swoole_str_match_all (line 36) | function swoole_str_match_all(string $string, string $pattern, int $flag...
  function swoole_str_json_decode (line 38) | function swoole_str_json_decode(string $string, int $depth = 512, int $f...
  function swoole_str_json_decode_to_object (line 40) | function swoole_str_json_decode_to_object(string $string, int $depth = 5...
  function swoole_parse_str (line 42) | function swoole_parse_str(string $string): array {}
  function swoole_hash (line 44) | function swoole_hash(string $data, string $algo, bool $binary = false, a...
  function swoole_typed_array (line 46) | function swoole_typed_array(string $typeDef, ?array $initArray = null): ...
  function swoole_str_replace (line 48) | function swoole_str_replace(string $subject, array|string $search, array...
  function swoole_str_ireplace (line 50) | function swoole_str_ireplace(string $subject, array|string $search, arra...
  function swoole_array_replace_str (line 52) | function swoole_array_replace_str(array $subjects, array|string $search,...
  function swoole_array_ireplace_str (line 54) | function swoole_array_ireplace_str(array $subjects, array|string $search...

FILE: ext-src/stubs/php_swoole_table.stub.php
  class Table (line 3) | final class Table {
    method __construct (line 4) | public function __construct(int $table_size, float $conflict_proportio...
    method column (line 5) | public function column(string $name, int $type, int $size = 0): bool {}
    method create (line 6) | public function create(): bool {}
    method set (line 7) | public function set(string $key, array $value): bool {}
    method get (line 8) | public function get(string $key, ?string $field = null): array|false|s...
    method del (line 9) | public function del(string $key): bool {}
    method exists (line 10) | public function exists(string $key): bool {}
    method incr (line 11) | public function incr(string $key, string $column, int|float $incrby = ...
    method decr (line 12) | public function decr(string $key, string $column, int|float $incrby = ...
    method count (line 13) | public function count(): int {}
    method destroy (line 14) | public function destroy(): bool {}
    method getSize (line 15) | public function getSize(): int {}
    method getMemorySize (line 16) | public function getMemorySize(): int {}
    method stats (line 17) | public function stats(): false|array {}
    method rewind (line 18) | public function rewind(): void {}
    method next (line 19) | public function next(): void {}
    method current (line 20) | public function current(): mixed {}
    method key (line 21) | public function key(): mixed {}
    method valid (line 22) | public function valid(): bool {}

FILE: ext-src/stubs/php_swoole_thread.stub.php
  class Thread (line 3) | class Thread {
    method __construct (line 5) | public function __construct(string $script_file, mixed ...$args) {}
    method join (line 7) | public function join(): bool {}
    method joinable (line 8) | public function joinable(): bool {}
    method getExitStatus (line 9) | public function getExitStatus(): int {}
    method isAlive (line 10) | public function isAlive(): bool {}
    method detach (line 11) | public function detach(): bool {}
    method getArguments (line 13) | public static function getArguments(): ?array {}
    method getId (line 14) | public static function getId(): int {}
    method getInfo (line 15) | public static function getInfo(): array {}
    method activeCount (line 16) | public static function activeCount(): int {}
    method yield (line 17) | public static function yield(): void {}
    method setName (line 19) | public static function setName(string $name): bool {}
    method setAffinity (line 21) | public static function setAffinity(array $cpu_settings): bool {}
    method getAffinity (line 22) | public static function getAffinity(): array {}
    method setPriority (line 24) | public static function setPriority(int $priority, int $policy = 0): bo...
    method getPriority (line 25) | public static function getPriority(): array {}
    method getNativeId (line 26) | public static function getNativeId(): int {}

FILE: ext-src/stubs/php_swoole_thread_arraylist.stub.php
  class ArrayList (line 3) | class ArrayList implements ArrayAccess, Countable {
    method __construct (line 4) | public function __construct(?array $array = null) {}
    method offsetGet (line 5) | public function offsetGet(mixed $key): mixed {}
    method offsetExists (line 6) | public function offsetExists(mixed $key): bool {}
    method offsetSet (line 7) | public function offsetSet(mixed $key, mixed $value): void {}
    method offsetUnset (line 8) | public function offsetUnset(mixed $key): void {}
    method find (line 9) | public function find(mixed $value): int {}
    method count (line 10) | public function count(): int {}
    method incr (line 11) | public function incr(mixed $key, mixed $value = 1): mixed {}
    method decr (line 12) | public function decr(mixed $key, mixed $value = 1): mixed {}
    method clean (line 13) | public function clean(): void {}
    method toArray (line 14) | public function toArray(): array {}
    method sort (line 15) | public function sort(): void {}

FILE: ext-src/stubs/php_swoole_thread_atomic.stub.php
  class Atomic (line 3) | class Atomic {
    method __construct (line 4) | public function __construct(int $value = 0) {}
    method add (line 5) | public function add(int $add_value = 1): int {}
    method sub (line 6) | public function sub(int $sub_value = 1): int {}
    method get (line 7) | public function get(): int {}
    method set (line 8) | public function set(int $value): void {}
    method cmpset (line 9) | public function cmpset(int $cmp_value, int $new_value): bool {}
    method wait (line 10) | public function wait(float $timeout = 1.0): bool {}
    method wakeup (line 11) | public function wakeup(int $count = 1): bool {}
  class Long (line 16) | class Long {
    method __construct (line 17) | public function __construct(int $value = 0) {}
    method add (line 18) | public function add(int $add_value = 1): int {}
    method sub (line 19) | public function sub(int $sub_value = 1): int {}
    method get (line 20) | public function get(): int {}
    method set (line 21) | public function set(int $value): void {}
    method cmpset (line 22) | public function cmpset(int $cmp_value, int $new_value): bool {}

FILE: ext-src/stubs/php_swoole_thread_barrier.stub.php
  class Barrier (line 3) | class Barrier {
    method __construct (line 4) | public function __construct(int $count) {}
    method wait (line 5) | public function wait(): void {}

FILE: ext-src/stubs/php_swoole_thread_lock.stub.php
  class Lock (line 3) | class Lock {
    method __construct (line 4) | public function __construct(int $type = SWOOLE_MUTEX) {}
    method lock (line 5) | public function lock(int $operation = LOCK_EX, float $timeout = -1): b...
    method unlock (line 6) | public function unlock(): bool {}

FILE: ext-src/stubs/php_swoole_thread_map.stub.php
  class Map (line 3) | class Map implements ArrayAccess, Countable {
    method __construct (line 4) | public function __construct(?array $array = null) {}
    method offsetGet (line 5) | public function offsetGet(mixed $key): mixed {}
    method offsetExists (line 6) | public function offsetExists(mixed $key): bool {}
    method offsetSet (line 7) | public function offsetSet(mixed $key, mixed $value): void {}
    method offsetUnset (line 8) | public function offsetUnset(mixed $key): void {}
    method find (line 9) | public function find(mixed $value): mixed {}
    method count (line 10) | public function count(): int {}
    method keys (line 11) | public function keys(): array {}
    method values (line 12) | public function values(): array {}
    method incr (line 13) | public function incr(mixed $key, mixed $value = 1): mixed {}
    method decr (line 14) | public function decr(mixed $key, mixed $value = 1): mixed {}
    method add (line 15) | public function add(mixed $key, mixed $value): bool {}
    method update (line 16) | public function update(mixed $key, mixed $value): bool {}
    method clean (line 17) | public function clean(): void {}
    method toArray (line 18) | public function toArray(): array {}
    method sort (line 19) | public function sort(): void {}

FILE: ext-src/stubs/php_swoole_thread_queue.stub.php
  class Queue (line 3) | class Queue implements Countable {
    method __construct (line 4) | public function __construct() {}
    method push (line 5) | public function push(mixed $value, int $notify_which = 0): void {}
    method pop (line 6) | public function pop(float $wait = 0): mixed {}
    method count (line 7) | public function count(): int {}
    method clean (line 8) | public function clean(): void {}

FILE: ext-src/stubs/php_swoole_timer.stub.php
  function swoole_timer_tick (line 3) | function swoole_timer_tick(int $ms, callable $callback, mixed ...$params...
  function swoole_timer_after (line 5) | function swoole_timer_after(int $ms, callable $callback, mixed ...$param...
  function swoole_timer_exists (line 7) | function swoole_timer_exists(int $timer_id): bool {}
  function swoole_timer_info (line 9) | function swoole_timer_info(int $timer_id): ?array {}
  function swoole_timer_stats (line 11) | function swoole_timer_stats(): array {}
  function swoole_timer_list (line 13) | function swoole_timer_list(): Swoole\Timer\Iterator {}
  function swoole_timer_clear (line 15) | function swoole_timer_clear(int $timer_id): bool {}
  function swoole_timer_clear_all (line 17) | function swoole_timer_clear_all() : bool {}

FILE: ext-src/stubs/php_swoole_tracer.stub.php
  function swoole_tracer_leak_detect (line 3) | function swoole_tracer_leak_detect(int $threshold = 64): void {}
  function swoole_tracer_prof_begin (line 4) | function swoole_tracer_prof_begin(?array $options = null): bool {}
  function swoole_tracer_prof_end (line 5) | function swoole_tracer_prof_end(string $output_file): bool {}

FILE: ext-src/stubs/php_swoole_websocket.stub.php
  class Server (line 3) | class Server {
    method push (line 4) | public function push(int $fd, \Swoole\WebSocket\Frame|string $data, in...
    method isEstablished (line 5) | public function isEstablished(int $fd): bool {}
    method pack (line 6) | public static function pack(\Swoole\WebSocket\Frame|string $data, int ...
    method unpack (line 7) | public static function unpack(string $data): \Swoole\WebSocket\Frame {}
    method disconnect (line 8) | public function disconnect(int $fd, int $code = SWOOLE_WEBSOCKET_CLOSE...
    method ping (line 9) | public function ping(int $fd, string $data = ""): bool {}
  class Frame (line 12) | class Frame {
    method __toString (line 13) | public function __toString(): string {}
    method pack (line 14) | public static function pack(\Swoole\WebSocket\Frame|string $data, int ...
    method unpack (line 15) | public static function unpack(string $data): \Swoole\WebSocket\Frame {}

FILE: ext-src/swoole_admin_server.cc
  type swoole (line 32) | namespace swoole {
    function handle_get_all_unix_sockets (line 38) | static std::string handle_get_all_unix_sockets(Server *_server, const ...
    function handle_get_all_sockets (line 91) | static std::string handle_get_all_sockets(Server *, const std::string ...
    function handle_get_all_commands (line 145) | static std::string handle_get_all_commands(Server *serv, const std::st...
    function json (line 163) | static json get_socket_info(int fd) {
    function json (line 183) | static json get_connection_info(Server *serv, Connection *conn) {
    function handle_get_socket_info (line 207) | static std::string handle_get_socket_info(Server *serv, const std::str...
    function handle_get_thread_info (line 233) | static std::string handle_get_thread_info(Server *serv, const std::str...
    function handle_get_manager_info (line 251) | static std::string handle_get_manager_info(Server *serv, const std::st...
    function get_socket_out_buffer_total_size (line 265) | static size_t get_socket_out_buffer_total_size() {
    function handle_get_memory_info (line 276) | static std::string handle_get_memory_info(Server *serv, const std::str...
    function handle_get_connections (line 300) | static std::string handle_get_connections(Server *serv, const std::str...
    function handle_get_connection_info (line 318) | static std::string handle_get_connection_info(Server *serv, const std:...
    function handle_get_all_ports (line 346) | static std::string handle_get_all_ports(Server *serv, const std::strin...
    function register_admin_server_commands (line 367) | void register_admin_server_commands(Server *serv) {
  function object_valid (line 391) | static inline bool object_valid(zend_object *obj) {
  function objects_store_foreach (line 395) | static void objects_store_foreach(const objects_store_iterator &fn) {
  function object_store_count (line 404) | static uint32_t object_store_count() {
  function sw_socket_parse_tcp_info (line 412) | std::unordered_map<std::string, uint64_t> sw_socket_parse_tcp_info(tcp_i...
  function ZEND_FUNCTION (line 554) | ZEND_FUNCTION(swoole_get_vm_status) {
  function ZEND_FUNCTION (line 560) | ZEND_FUNCTION(swoole_get_objects) {
  function ZEND_FUNCTION (line 575) | ZEND_FUNCTION(swoole_get_object_by_handle) {

FILE: ext-src/swoole_async_coro.cc
  type DNSCacheEntity (line 30) | struct DNSCacheEntity {
  function php_swoole_async_coro_rshutdown (line 37) | void php_swoole_async_coro_rshutdown() {
  function php_swoole_set_aio_option (line 43) | void php_swoole_set_aio_option(const HashTable *vht) {
  function PHP_FUNCTION (line 77) | PHP_FUNCTION(swoole_async_set) {
  function PHP_FUNCTION (line 126) | PHP_FUNCTION(swoole_async_dns_lookup_coro) {

FILE: ext-src/swoole_atomic.cc
  type AtomicObject (line 30) | struct AtomicObject {
  function sw_inline (line 35) | static sw_inline AtomicObject *atomic_fetch_object(zend_object *obj) {
  function sw_atomic_t (line 39) | static sw_atomic_t *atomic_get_ptr(const zval *zobject) {
  function atomic_free_object (line 43) | static void atomic_free_object(zend_object *object) {
  function zend_object (line 48) | static zend_object *atomic_create_object(zend_class_entry *ce) {
  type AtomicLongObject (line 65) | struct AtomicLongObject {
  function AtomicLongObject (line 70) | static AtomicLongObject *atomic_long_fetch_object(zend_object *obj) {
  function sw_atomic_long_t (line 74) | static sw_atomic_long_t *atomic_long_get_ptr(const zval *zobject) {
  function atomic_long_free_object (line 78) | static void atomic_long_free_object(zend_object *object) {
  function zend_object (line 83) | static zend_object *atomic_long_create_object(zend_class_entry *ce) {
  function php_swoole_atomic_minit (line 103) | static PHP_METHOD(swoole_atomic, add);
  function PHP_METHOD (line 162) | PHP_METHOD(swoole_atomic, __construct) {
  function PHP_METHOD (line 174) | PHP_METHOD(swoole_atomic, add) {
  function PHP_METHOD (line 186) | PHP_METHOD(swoole_atomic, sub) {
  function PHP_METHOD (line 198) | PHP_METHOD(swoole_atomic, get) {
  function PHP_METHOD (line 203) | PHP_METHOD(swoole_atomic, set) {
  function PHP_METHOD (line 214) | PHP_METHOD(swoole_atomic, cmpset) {
  function PHP_METHOD (line 226) | PHP_METHOD(swoole_atomic, wait) {
  function PHP_METHOD (line 238) | PHP_METHOD(swoole_atomic, wakeup) {
  function PHP_METHOD (line 250) | PHP_METHOD(swoole_atomic_long, __construct) {
  function PHP_METHOD (line 263) | PHP_METHOD(swoole_atomic_long, add) {
  function PHP_METHOD (line 275) | PHP_METHOD(swoole_atomic_long, sub) {
  function PHP_METHOD (line 287) | PHP_METHOD(swoole_atomic_long, get) {
  function PHP_METHOD (line 292) | PHP_METHOD(swoole_atomic_long, set) {
  function PHP_METHOD (line 303) | PHP_METHOD(swoole_atomic_long, cmpset) {

FILE: ext-src/swoole_channel_coro.cc
  type ChannelObject (line 33) | struct ChannelObject {
  function channel_coro_fetch_object (line 40) | static PHP_METHOD(swoole_channel_coro, push);
  function Channel (line 68) | static Channel *channel_coro_get_ptr(const zval *zobject) {
  function channel_coro_dtor_object (line 76) | static void channel_coro_dtor_object(zend_object *object) {
  function channel_coro_free_object (line 91) | static void channel_coro_free_object(zend_object *object) {
  function zend_object (line 97) | static zend_object *channel_coro_create_object(zend_class_entry *ce) {
  function php_swoole_channel_coro_minit (line 105) | void php_swoole_channel_coro_minit(int module_number) {
  function PHP_METHOD (line 126) | static PHP_METHOD(swoole_channel_coro, __construct) {
  function PHP_METHOD (line 143) | static PHP_METHOD(swoole_channel_coro, push) {
  function PHP_METHOD (line 169) | static PHP_METHOD(swoole_channel_coro, pop) {
  function PHP_METHOD (line 191) | static PHP_METHOD(swoole_channel_coro, close) {
  function PHP_METHOD (line 196) | static PHP_METHOD(swoole_channel_coro, length) {
  function PHP_METHOD (line 201) | static PHP_METHOD(swoole_channel_coro, isEmpty) {
  function PHP_METHOD (line 206) | static PHP_METHOD(swoole_channel_coro, isFull) {
  function PHP_METHOD (line 211) | static PHP_METHOD(swoole_channel_coro, stats) {

FILE: ext-src/swoole_client.cc
  function sw_inline (line 49) | static sw_inline void php_swoole_client_set_cli(const zval *zobject, Cli...
  function zval (line 54) | static zval *client_get_zsocket(const zval *zobject) {
  function client_set_zsocket (line 58) | static void client_set_zsocket(const zval *zobject, zval *zsocket) {
  function client_free_object (line 63) | static void client_free_object(zend_object *object) {
  function zend_object (line 71) | static zend_object *client_create_object(zend_class_entry *ce) {
  function php_swoole_client_get_cli_safe (line 82) | static PHP_METHOD(swoole_client, __destruct);
  function php_swoole_client_minit (line 156) | void php_swoole_client_minit(int module_number) {
  function php_swoole_client_check_ssl_setting (line 187) | void php_swoole_client_check_ssl_setting(const Client *cli, const zval *...
  function php_swoole_client_check_setting (line 253) | bool php_swoole_client_check_setting(Client *cli, const zval *zset) {
  function php_swoole_client_free (line 447) | void php_swoole_client_free(const zval *zobject, Client *cli) {
  function php_swoole_length_func (line 481) | ssize_t php_swoole_length_func(const Protocol *protocol, Socket *_socket...
  function Client (line 500) | static Client *php_swoole_client_new(zval *zobject, char *host, int host...
  function PHP_METHOD (line 571) | static PHP_METHOD(swoole_client, __construct) {
  function PHP_METHOD (line 606) | static PHP_METHOD(swoole_client, __destruct) {
  function PHP_METHOD (line 616) | static PHP_METHOD(swoole_client, set) {
  function PHP_METHOD (line 631) | static PHP_METHOD(swoole_client, connect) {
  function PHP_METHOD (line 700) | static PHP_METHOD(swoole_client, send) {
  function PHP_METHOD (line 734) | static PHP_METHOD(swoole_client, sendto) {
  function PHP_METHOD (line 767) | static PHP_METHOD(swoole_client, sendfile) {
  function PHP_METHOD (line 807) | static PHP_METHOD(swoole_client, recv) {
  function PHP_METHOD (line 1000) | static PHP_METHOD(swoole_client, isConnected) {
  function PHP_METHOD (line 1011) | static PHP_METHOD(swoole_client, getsockname) {
  function PHP_METHOD (line 1029) | static PHP_METHOD(swoole_client, getSocket) {
  function PHP_METHOD (line 1053) | static PHP_METHOD(swoole_client, getpeername) {
  function PHP_METHOD (line 1071) | static PHP_METHOD(swoole_client, close) {
  function php_swoole_client_enable_ssl_encryption (line 1112) | bool php_swoole_client_enable_ssl_encryption(Client *cli, zval *zobject) {
  function PHP_METHOD (line 1129) | static PHP_METHOD(swoole_client, enableSSL) {
  function PHP_METHOD (line 1153) | static PHP_METHOD(swoole_client, getPeerCert) {
  function PHP_METHOD (line 1168) | static PHP_METHOD(swoole_client, verifyPeerCert) {
  function PHP_METHOD (line 1184) | static PHP_METHOD(swoole_client, shutdown) {
  function PHP_FUNCTION (line 1196) | PHP_FUNCTION(swoole_client_select) {
  function client_poll_get (line 1252) | static inline int client_poll_get(const pollfd *fds, int maxevents, int ...
  function client_poll_wait (line 1261) | static int client_poll_wait(zval *sock_array, const pollfd *fds, int max...
  function client_poll_add (line 1305) | static uint32_t client_poll_add(const zval *sock_array, uint32_t index, ...

FILE: ext-src/swoole_client_async.cc
  function PHP_METHOD (line 31) | static PHP_METHOD(swoole_client_async, __construct);

FILE: ext-src/swoole_client_coro.cc
  type ClientCoroObject (line 34) | struct ClientCoroObject {
  function client_coro_fetch_object (line 44) | static PHP_METHOD(swoole_client_coro, __destruct);
  function ClientCoroObject (line 92) | static ClientCoroObject *client_coro_get_client(const zval *zobject) {
  function SocketImpl (line 96) | static SocketImpl *client_coro_get_socket(const zval *zobject) {
  function client_coro_free_object (line 100) | static void client_coro_free_object(zend_object *object) {
  function zend_object (line 116) | static zend_object *client_coro_create_object(zend_class_entry *ce) {
  function client_coro_socket_dtor (line 126) | static void client_coro_socket_dtor(ClientCoroObject *client) {
  function SocketImpl (line 138) | static SocketImpl *client_coro_create_socket(zval *zobject, zend_long ty...
  function php_swoole_client_coro_minit (line 166) | void php_swoole_client_coro_minit(int module_number) {
  function sw_inline (line 188) | static sw_inline SocketImpl *client_coro_get_socket_for_connect(zval *zo...
  function PHP_METHOD (line 214) | static PHP_METHOD(swoole_client_coro, __construct) {
  function PHP_METHOD (line 237) | static PHP_METHOD(swoole_client_coro, __destruct) {}
  function PHP_METHOD (line 239) | static PHP_METHOD(swoole_client_coro, set) {
  function PHP_METHOD (line 259) | static PHP_METHOD(swoole_client_coro, connect) {
  function PHP_METHOD (line 294) | static PHP_METHOD(swoole_client_coro, send) {
  function PHP_METHOD (line 325) | static PHP_METHOD(swoole_client_coro, sendto) {
  function PHP_METHOD (line 366) | static PHP_METHOD(swoole_client_coro, recvfrom) {
  function PHP_METHOD (line 409) | static PHP_METHOD(swoole_client_coro, sendfile) {
  function PHP_METHOD (line 441) | static PHP_METHOD(swoole_client_coro, recv) {
  function PHP_METHOD (line 485) | static PHP_METHOD(swoole_client_coro, peek) {
  function PHP_METHOD (line 509) | static PHP_METHOD(swoole_client_coro, isConnected) {
  function PHP_METHOD (line 518) | static PHP_METHOD(swoole_client_coro, getsockname) {
  function PHP_METHOD (line 537) | static PHP_METHOD(swoole_client_coro, exportSocket) {
  function PHP_METHOD (line 542) | static PHP_METHOD(swoole_client_coro, getpeername) {
  function PHP_METHOD (line 560) | static PHP_METHOD(swoole_client_coro, close) {
  function PHP_METHOD (line 570) | static PHP_METHOD(swoole_client_coro, enableSSL) {
  function PHP_METHOD (line 595) | static PHP_METHOD(swoole_client_coro, getPeerCert) {
  function PHP_METHOD (line 607) | static PHP_METHOD(swoole_client_coro, verifyPeerCert) {

FILE: ext-src/swoole_coroutine.cc
  type sw_exit_flags (line 54) | enum sw_exit_flags { SW_EXIT_IN_COROUTINE = 1 << 1, SW_EXIT_IN_SERVER = ...
  function SW_LOOP_N (line 1458) | SW_LOOP_N(count) {

FILE: ext-src/swoole_coroutine_lock.cc
  type CoLockObject (line 30) | struct CoLockObject {
  function CoLockObject (line 36) | static CoLockObject *co_lock_fetch_object(zend_object *obj) {
  function CoroutineLock (line 40) | static CoroutineLock *co_lock_get_ptr(zval *zobject) {
  function CoroutineLock (line 44) | static CoroutineLock *co_lock_get_and_check_ptr(zval *zobject) {
  function co_lock_set_ptr (line 52) | static void co_lock_set_ptr(zval *zobject, CoroutineLock *ptr) {
  function co_lock_free_object (line 56) | static void co_lock_free_object(zend_object *object) {
  function zend_object (line 64) | static zend_object *co_lock_create_object(zend_class_entry *ce) {
  function php_swoole_coroutine_lock_minit (line 88) | void php_swoole_coroutine_lock_minit(int module_number) {
  function PHP_METHOD (line 97) | static PHP_METHOD(swoole_coroutine_lock, __construct) {
  function PHP_METHOD (line 116) | static PHP_METHOD(swoole_coroutine_lock, lock) {
  function PHP_METHOD (line 128) | static PHP_METHOD(swoole_coroutine_lock, unlock) {

FILE: ext-src/swoole_coroutine_scheduler.cc
  type SchedulerTask (line 33) | struct SchedulerTask {
  type SchedulerObject (line 39) | struct SchedulerObject {
  function SW_EXTERN_C_END (line 52) | SW_EXTERN_C_END
  function zend_object (line 59) | static zend_object *scheduler_create_object(zend_class_entry *ce) {
  function scheduler_free_object (line 67) | static void scheduler_free_object(zend_object *object) {
  function php_swoole_coroutine_scheduler_minit (line 95) | void php_swoole_coroutine_scheduler_minit(int module_number) {
  function php_swoole_coroutine_reactor_can_exit (line 111) | static bool php_swoole_coroutine_reactor_can_exit(Reactor *reactor, size...
  function php_swoole_coroutine_scheduler_rshutdown (line 126) | void php_swoole_coroutine_scheduler_rshutdown() {
  function php_swoole_set_coroutine_option (line 143) | void php_swoole_set_coroutine_option(zend_array *vht) {
  function PHP_METHOD (line 179) | PHP_METHOD(swoole_coroutine_scheduler, set) {
  function PHP_METHOD (line 220) | PHP_METHOD(swoole_coroutine_scheduler, getOptions) {
  function scheduler_add_task (line 227) | static void scheduler_add_task(SchedulerObject *s, SchedulerTask *task) {
  function PHP_METHOD (line 236) | static PHP_METHOD(swoole_coroutine_scheduler, add) {
  function PHP_METHOD (line 255) | static PHP_METHOD(swoole_coroutine_scheduler, parallel) {
  function PHP_METHOD (line 276) | static PHP_METHOD(swoole_coroutine_scheduler, start) {

FILE: ext-src/swoole_coroutine_system.cc
  type FileOperateFlag (line 32) | enum FileOperateFlag {
  function php_swoole_coroutine_system_minit (line 59) | void php_swoole_coroutine_system_minit(int module_number) {
  function PHP_METHOD (line 67) | PHP_METHOD(swoole_coroutine_system, sleep) {
  function PHP_METHOD (line 81) | PHP_METHOD(swoole_coroutine_system, readFile) {
  function PHP_METHOD (line 100) | PHP_METHOD(swoole_coroutine_system, writeFile) {
  function PHP_FUNCTION (line 129) | PHP_FUNCTION(swoole_coroutine_gethostbyname) {
  function PHP_FUNCTION (line 162) | PHP_FUNCTION(swoole_clear_dns_cache) {
  function PHP_METHOD (line 166) | PHP_METHOD(swoole_coroutine_system, getaddrinfo) {
  function PHP_METHOD (line 209) | PHP_METHOD(swoole_coroutine_system, statvfs) {
  function PHP_METHOD (line 234) | PHP_METHOD(swoole_coroutine_system, exec) {
  function swoole_coroutine_system_wait (line 265) | static void swoole_coroutine_system_wait(INTERNAL_FUNCTION_PARAMETERS, p...
  function PHP_METHOD (line 285) | PHP_METHOD(swoole_coroutine_system, wait) {
  function PHP_METHOD (line 297) | PHP_METHOD(swoole_coroutine_system, waitPid) {
  function PHP_METHOD (line 311) | PHP_METHOD(swoole_coroutine_system, waitSignal) {
  function PHP_METHOD (line 348) | PHP_METHOD(swoole_coroutine_system, waitEvent) {

FILE: ext-src/swoole_curl.cc
  type swoole (line 22) | namespace swoole {
    type curl (line 23) | namespace curl {
      function Handle (line 25) | Handle *get_handle(CURL *cp) {
      function Handle (line 34) | Handle *create_handle(CURL *cp) {
      function destroy_handle (line 41) | void destroy_handle(CURL *cp) {
      function execute_callback (line 52) | static int execute_callback(Event *event, int bitmask) {
      function CURLMcode (line 194) | CURLMcode Multi::add_handle(Handle *handle) {
      function CURLMcode (line 209) | CURLMcode Multi::remove_handle(Handle *handle) const {
      function CURLcode (line 237) | CURLcode Multi::exec(Handle *handle) {
    function CURLcode (line 273) | CURLcode Multi::read_info() const {
  function CURLcode (line 420) | CURLcode swoole_curl_easy_perform(CURL *cp) {
  function swoole_curl_easy_reset (line 428) | void swoole_curl_easy_reset(CURL *cp) {
  function php_curl (line 434) | php_curl *swoole_curl_get_handle(zval *zid, bool exclusive, bool require...

FILE: ext-src/swoole_event.cc
  type EventObject (line 35) | struct EventObject {
  function php_swoole_event_minit (line 79) | void php_swoole_event_minit(int module_number) {
  function event_object_free (line 129) | static void event_object_free(void *data) {
  function event_readable_callback (line 137) | static int event_readable_callback(Reactor *reactor, Event *event) {
  function event_writable_callback (line 158) | static int event_writable_callback(Reactor *reactor, Event *event) {
  function event_error_callback (line 179) | static int event_error_callback(Reactor *reactor, Event *event) {
  function event_defer_callback (line 204) | static void event_defer_callback(void *data) {
  function event_cycle_callback (line 212) | static void event_cycle_callback(void *data) {
  function php_swoole_reactor_init (line 219) | int php_swoole_reactor_init() {
  function php_swoole_event_wait (line 255) | void php_swoole_event_wait() {
  function php_swoole_event_exit (line 282) | void php_swoole_event_exit() {
  function php_swoole_convert_to_fd (line 289) | int php_swoole_convert_to_fd(zval *zsocket) {
  function php_swoole_convert_to_fd_ex (line 342) | int php_swoole_convert_to_fd_ex(zval *zsocket, int *async) {
  function php_socket (line 372) | php_socket *php_swoole_convert_to_socket(int sock) {
  function event_check_reactor (line 386) | static void event_check_reactor() {
  function Socket (line 396) | static Socket *event_get_socket(int socket_fd) {
  function PHP_FUNCTION (line 404) | static PHP_FUNCTION(swoole_event_add) {
  function PHP_FUNCTION (line 476) | static PHP_FUNCTION(swoole_event_write) {
  function PHP_FUNCTION (line 511) | static PHP_FUNCTION(swoole_event_set) {
  function PHP_FUNCTION (line 574) | static PHP_FUNCTION(swoole_event_del) {
  function PHP_FUNCTION (line 604) | static PHP_FUNCTION(swoole_event_defer) {
  function PHP_FUNCTION (line 618) | static PHP_FUNCTION(swoole_event_cycle) {
  function PHP_FUNCTION (line 652) | static PHP_FUNCTION(swoole_event_exit) {
  function PHP_FUNCTION (line 656) | static PHP_FUNCTION(swoole_event_wait) {
  function PHP_FUNCTION (line 663) | static PHP_FUNCTION(swoole_event_rshutdown) {
  function PHP_FUNCTION (line 677) | static PHP_FUNCTION(swoole_event_dispatch) {
  function PHP_FUNCTION (line 689) | static PHP_FUNCTION(swoole_event_isset) {

FILE: ext-src/swoole_firebird.cc
  function swoole_firebird_set_blocking (line 29) | void swoole_firebird_set_blocking(bool blocking) {
  function ISC_STATUS (line 33) | ISC_STATUS swoole_isc_attach_database(
  function ISC_STATUS (line 43) | ISC_STATUS swoole_isc_detach_database(ISC_STATUS *_0, isc_db_handle *_1) {
  function ISC_STATUS (line 52) | ISC_STATUS swoole_isc_dsql_execute(
  function ISC_STATUS (line 62) | ISC_STATUS swoole_isc_dsql_execute2(
  function ISC_STATUS (line 72) | ISC_STATUS swoole_isc_dsql_sql_info(
  function ISC_STATUS (line 82) | ISC_STATUS swoole_isc_dsql_free_statement(ISC_STATUS *_0, isc_stmt_handl...
  function ISC_STATUS (line 91) | ISC_STATUS swoole_isc_start_transaction(
  function ISC_STATUS (line 101) | ISC_STATUS swoole_isc_commit_retaining(ISC_STATUS *_0, isc_tr_handle *_1) {
  function ISC_STATUS (line 110) | ISC_STATUS swoole_isc_commit_transaction(ISC_STATUS *_0, isc_tr_handle *...
  function ISC_STATUS (line 119) | ISC_STATUS swoole_isc_rollback_transaction(ISC_STATUS *_0, isc_tr_handle...
  function ISC_STATUS (line 128) | ISC_STATUS swoole_isc_dsql_allocate_statement(ISC_STATUS *_0, isc_db_han...
  function ISC_STATUS (line 137) | ISC_STATUS swoole_isc_dsql_prepare(ISC_STATUS *_0,
  function ISC_STATUS (line 152) | ISC_STATUS swoole_isc_dsql_fetch(ISC_STATUS *_0, isc_stmt_handle *_1, un...
  function ISC_STATUS (line 161) | ISC_STATUS swoole_isc_open_blob(
  function ISC_STATUS (line 171) | ISC_STATUS swoole_isc_blob_info(
  function ISC_STATUS (line 181) | ISC_STATUS swoole_isc_get_segment(
  function ISC_STATUS (line 191) | ISC_STATUS swoole_isc_put_segment(ISC_STATUS *_0, isc_blob_handle *_1, u...
  function ISC_STATUS (line 200) | ISC_STATUS swoole_isc_create_blob(
  function ISC_STATUS (line 210) | ISC_STATUS swoole_isc_close_blob(ISC_STATUS *_0, isc_blob_handle *_1) {
  function ISC_STATUS (line 219) | ISC_STATUS swoole_isc_dsql_set_cursor_name(ISC_STATUS *_0,
  function ISC_STATUS (line 231) | ISC_STATUS swoole_fb_ping(ISC_STATUS *_0, isc_db_handle *_1) {
  function swoole_isc_version (line 240) | int swoole_isc_version(isc_db_handle *_0, ISC_VERSION_CALLBACK _1, void ...
  function php_swoole_firebird_minit (line 249) | void php_swoole_firebird_minit(int module_id) {
  function php_swoole_firebird_mshutdown (line 266) | void php_swoole_firebird_mshutdown() {

FILE: ext-src/swoole_http2_client_coro.cc
  type swoole (line 50) | namespace swoole {
    type coroutine (line 51) | namespace coroutine {
      type http2 (line 52) | namespace http2 {
        type Stream (line 54) | struct Stream {
        class Client (line 70) | class Client {
          method Client (line 96) | Client(const char *_host, size_t _host_len, int _port, bool _ssl...
          method Stream (line 106) | Stream *get_stream(uint32_t _stream_id) {
          method update_error_properties (line 117) | void update_error_properties(int code, const char *msg) const {
          method io_error (line 121) | void io_error() const {
          method nghttp2_error (line 125) | void nghttp2_error(int code, const char *msg) const {
          method is_available (line 129) | bool is_available() const {
          method apply_setting (line 137) | void apply_setting(const zval *zset) const {
          method recv_packet (line 143) | bool recv_packet(double _timeout) const {
          method delete_stream (line 155) | bool delete_stream(uint32_t _stream_id) {
          method clean_send_queue (line 188) | void clean_send_queue() {
          method send (line 196) | bool send(const char *buf, size_t len) {
  type Http2ClientObject (line 235) | struct Http2ClientObject {
  function sw_inline (line 240) | static sw_inline Http2ClientObject *http2_client_coro_fetch_object(zend_...
  function sw_inline (line 245) | static sw_inline Client *http2_client_coro_get_client(const zval *zobjec...
  function http2_client_coro_free_object (line 249) | static void http2_client_coro_free_object(zend_object *object) {
  function zend_object (line 258) | static zend_object *http2_client_coro_create_object(zend_class_entry *ce) {
  function php_swoole_http2_client_coro_minit (line 268) | static PHP_METHOD(swoole_http2_client_coro, __destruct);
  function ReturnCode (line 499) | ReturnCode Client::parse_frame(zval *return_value, bool pipeline_read) {
  function php_swoole_zlib_decompress (line 738) | int php_swoole_zlib_decompress(z_stream *stream, String *buffer, char *b...
  function PHP_METHOD (line 791) | static PHP_METHOD(swoole_http2_client_coro, __construct) {
  function PHP_METHOD (line 818) | static PHP_METHOD(swoole_http2_client_coro, set) {
  function ZEND_HASH_FOREACH_STR_KEY_VAL (line 982) | ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zheaders), key, zvalue) {
  function ZEND_HASH_FOREACH_STR_KEY_VAL (line 1014) | ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zcookies), key, zvalue) {
  function Stream (line 1061) | Stream *Client::create_stream(uint32_t _stream_id, uint8_t flags) {
  function PHP_METHOD (line 1284) | static PHP_METHOD(swoole_http2_client_coro, send) {
  function http2_client_coro_recv (line 1307) | static void http2_client_coro_recv(INTERNAL_FUNCTION_PARAMETERS, bool pi...
  function PHP_METHOD (line 1336) | static PHP_METHOD(swoole_http2_client_coro, recv) {
  function PHP_METHOD (line 1340) | static PHP_METHOD(swoole_http2_client_coro, __destruct) {}
  function PHP_METHOD (line 1342) | static PHP_METHOD(swoole_http2_client_coro, close) {
  function PHP_METHOD (line 1348) | static PHP_METHOD(swoole_http2_client_coro, connect) {
  function sw_inline (line 1353) | static sw_inline void http2_client_settings_to_array(const Http2::Settin...
  function PHP_METHOD (line 1362) | static PHP_METHOD(swoole_http2_client_coro, stats) {
  function PHP_METHOD (line 1398) | static PHP_METHOD(swoole_http2_client_coro, isStreamExist) {
  function PHP_METHOD (line 1419) | static PHP_METHOD(swoole_http2_client_coro, write) {
  function PHP_METHOD (line 1442) | static PHP_METHOD(swoole_http2_client_coro, read) {
  function PHP_METHOD (line 1446) | static PHP_METHOD(swoole_http2_client_coro, ping) {
  function PHP_METHOD (line 1465) | static PHP_METHOD(swoole_http2_client_coro, goaway) {

FILE: ext-src/swoole_http2_server.cc
  function http2_server_send_window_update (line 128) | static void http2_server_send_window_update(HttpContext *ctx, uint32_t s...
  function http2_server_build_trailer (line 137) | static ssize_t http2_server_build_trailer(const HttpContext *ctx, uchar ...
  function http2_server_is_static_file (line 188) | static bool http2_server_is_static_file(Server *serv, HttpContext *ctx) {
  function http2_server_onRequest (line 273) | static void http2_server_onRequest(const std::shared_ptr<Http2Session> &...
  function http2_server_build_header (line 319) | static ssize_t http2_server_build_header(HttpContext *ctx, uchar *buffer...
  function swoole_http2_server_ping (line 470) | bool swoole_http2_server_ping(HttpContext *ctx) {
  function http2_server_send_setting_ack (line 476) | static bool http2_server_send_setting_ack(HttpContext *ctx) {
  function http2_server_send_rst_stream (line 482) | static bool http2_server_send_rst_stream(HttpContext *ctx, int error_cod...
  function swoole_http2_server_goaway (line 489) | bool swoole_http2_server_goaway(HttpContext *ctx, zend_long error_code, ...
  function swoole_http2_server_end (line 650) | bool swoole_http2_server_end(HttpContext *ctx, zend_string *sdata) {
  function swoole_http2_server_write (line 662) | bool swoole_http2_server_write(HttpContext *ctx, zend_string *sdata) {
  function http2_server_respond (line 687) | static bool http2_server_respond(HttpContext *ctx, const String *body) {
  function http2_server_send_status_code (line 739) | static bool http2_server_send_status_code(HttpContext *ctx, int status_c...
  function http2_server_send_range_file (line 746) | static bool http2_server_send_range_file(HttpContext *ctx, StaticHandler...
  function swoole_http2_server_send_file (line 855) | bool swoole_http2_server_send_file(HttpContext *ctx, zend_string *file, ...
  function http2_server_onBeforeRequest (line 920) | static bool http2_server_onBeforeRequest(HttpContext *ctx) {
  function http2_server_parse_header (line 933) | static int http2_server_parse_header(
  function swoole_http2_server_parse (line 1064) | int swoole_http2_server_parse(const std::shared_ptr<Http2Session> &clien...
  function swoole_http2_server_onReceive (line 1277) | int swoole_http2_server_onReceive(Server *serv, Connection *conn, RecvDa...
  function swoole_http2_server_session_new (line 1304) | std::shared_ptr<Http2Session> swoole_http2_server_session_new(SessionId ...
  function php_swoole_http2_server_onClose (line 1310) | void php_swoole_http2_server_onClose(Server *serv, SessionId session_id) {
  function swoole_http2_server_session_free (line 1316) | void swoole_http2_server_session_free(SessionId session_id) {

FILE: ext-src/swoole_http_client_coro.cc
  type swoole (line 80) | namespace swoole {
    type coroutine (line 81) | namespace coroutine {
      type http (line 82) | namespace http {
        class Client (line 83) | class Client {
          type swHttpCompressMethod (line 104) | enum swHttpCompressMethod
          method is_available (line 144) | bool is_available() const {
          method add_headers (line 169) | static void add_headers(String *buf, const char *key, size_t key...
          method add_content_length (line 176) | static void add_content_length(String *buf, size_t length) {
          method create_token (line 182) | static void create_token(int length, char *buf) {
          method get_header_out (line 209) | void get_header_out(zval *return_value) const {
          method getsockname (line 228) | void getsockname(zval *return_value) const {
          method getpeername (line 241) | void getpeername(zval *return_value) const {
          method getpeercert (line 255) | void getpeercert(zval *return_value) const {
  type HttpClientObject (line 290) | struct HttpClientObject {
  function php_swoole_http_parse_set_cookies (line 297) | static PHP_METHOD(swoole_http_client_coro, __destruct);
  function http_parser_on_header_field (line 401) | static int http_parser_on_header_field(llhttp_t *parser, const char *at,...
  function http_parser_on_header_value (line 408) | static int http_parser_on_header_value(llhttp_t *parser, const char *at,...
  function http_parser_on_headers_complete (line 478) | static int http_parser_on_headers_complete(llhttp_t *parser) {
  function http_parser_on_body (line 486) | static int http_parser_on_body(llhttp_t *parser, const char *at, size_t ...
  function http_parser_on_message_complete (line 541) | static int http_parser_on_message_complete(llhttp_t *parser) {
  function SW_HASHTABLE_FOREACH_START2 (line 1006) | SW_HASHTABLE_FOREACH_START2(Z_ARRVAL_P(zheaders), key, keylen, keytype, ...
  function SW_HASHTABLE_FOREACH_START2 (line 1086) | SW_HASHTABLE_FOREACH_START2(Z_ARRVAL_P(zcookies), key, keylen, keytype, ...
  function SW_HASHTABLE_FOREACH_START2 (line 1156) | SW_HASHTABLE_FOREACH_START2(Z_ARRVAL_P(zupload_files), key, keylen, keyt...
  function SW_HASHTABLE_FOREACH_START2 (line 1183) | SW_HASHTABLE_FOREACH_START2(Z_ARRVAL_P(zbody), key, keylen, keytype, zva...
  function SW_HASHTABLE_FOREACH_START2 (line 1208) | SW_HASHTABLE_FOREACH_START2(Z_ARRVAL_P(zupload_files), key, keylen, keyt...
  function sw_inline (line 1652) | static sw_inline HttpClientObject *http_client_coro_fetch_object(zend_ob...
  function sw_inline (line 1657) | static sw_inline Client *http_client_coro_get_client(const zval *zobject) {
  function http_client_coro_free_object (line 1665) | static void http_client_coro_free_object(zend_object *object) {
  function zend_object (line 1674) | static zend_object *http_client_coro_create_object(zend_class_entry *ce) {
  function php_swoole_http_client_coro_minit (line 1682) | void php_swoole_http_client_coro_minit(int module_number) {
  function PHP_METHOD (line 1739) | static PHP_METHOD(swoole_http_client_coro, __construct) {
  function PHP_METHOD (line 1764) | static PHP_METHOD(swoole_http_client_coro, __destruct) {}
  function PHP_METHOD (line 1766) | static PHP_METHOD(swoole_http_client_coro, set) {
  function PHP_METHOD (line 1785) | static PHP_METHOD(swoole_http_client_coro, getDefer) {
  function PHP_METHOD (line 1791) | static PHP_METHOD(swoole_http_client_coro, setDefer) {
  function PHP_METHOD (line 1805) | static PHP_METHOD(swoole_http_client_coro, setMethod) {
  function PHP_METHOD (line 1820) | static PHP_METHOD(swoole_http_client_coro, setHeaders) {
  function PHP_METHOD (line 1832) | static PHP_METHOD(swoole_http_client_coro, setBasicAuth) {
  function PHP_METHOD (line 1845) | static PHP_METHOD(swoole_http_client_coro, setCookies) {
  function PHP_METHOD (line 1857) | static PHP_METHOD(swoole_http_client_coro, setData) {
  function PHP_METHOD (line 1869) | static PHP_METHOD(swoole_http_client_coro, addFile) {
  function PHP_METHOD (line 1946) | static PHP_METHOD(swoole_http_client_coro, addData) {
  function PHP_METHOD (line 1986) | static PHP_METHOD(swoole_http_client_coro, execute) {
  function PHP_METHOD (line 1998) | static PHP_METHOD(swoole_http_client_coro, get) {
  function PHP_METHOD (line 2012) | static PHP_METHOD(swoole_http_client_coro, post) {
  function PHP_METHOD (line 2029) | static PHP_METHOD(swoole_http_client_coro, download) {
  function PHP_METHOD (line 2049) | static PHP_METHOD(swoole_http_client_coro, upgrade) {
  function PHP_METHOD (line 2061) | static PHP_METHOD(swoole_http_client_coro, push) {
  function PHP_METHOD (line 2086) | static PHP_METHOD(swoole_http_client_coro, recv) {
  function PHP_METHOD (line 2108) | static PHP_METHOD(swoole_http_client_coro, close) {
  function PHP_METHOD (line 2114) | static PHP_METHOD(swoole_http_client_coro, getBody) {
  function PHP_METHOD (line 2118) | static PHP_METHOD(swoole_http_client_coro, getHeaders) {
  function PHP_METHOD (line 2122) | static PHP_METHOD(swoole_http_client_coro, getCookies) {
  function PHP_METHOD (line 2126) | static PHP_METHOD(swoole_http_client_coro, getStatusCode) {
  function PHP_METHOD (line 2130) | static PHP_METHOD(swoole_http_client_coro, getHeaderOut) {
  function PHP_METHOD (line 2135) | static PHP_METHOD(swoole_http_client_coro, getsockname) {
  function PHP_METHOD (line 2140) | static PHP_METHOD(swoole_http_client_coro, getpeername) {
  function PHP_METHOD (line 2145) | static PHP_METHOD(swoole_http_client_coro, getPeerCert) {
  function PHP_METHOD (line 2150) | static PHP_METHOD(swoole_http_client_coro, ping) {
  function PHP_METHOD (line 2168) | static PHP_METHOD(swoole_http_client_coro, disconnect) {

FILE: ext-src/swoole_http_cookie.cc
  type HttpCookieObject (line 32) | struct HttpCookieObject {
  function sw_inline (line 37) | static sw_inline HttpCookieObject *php_swoole_http_cookie_fetch_object(z...
  function HttpCookie (line 41) | static HttpCookie *php_swoole_http_get_cookie(const zval *zobject) {
  function HttpCookie (line 45) | HttpCookie *php_swoole_http_get_cooke_safety(const zval *zobject) {
  function php_swoole_http_response_set_cookie (line 54) | void php_swoole_http_response_set_cookie(const zval *zobject, HttpCookie...
  function zend_object (line 58) | static zend_object *php_swoole_http_cookie_create_object(zend_class_entr...
  function php_swoole_http_cookie_free_object (line 66) | static void php_swoole_http_cookie_free_object(zend_object *object) {
  function php_swoole_http_cookie_minit (line 73) | static PHP_METHOD(swoole_http_cookie, withName);
  function HttpCookie (line 133) | HttpCookie *HttpCookie::withName(zend_string *_name) {
  function HttpCookie (line 137) | HttpCookie *HttpCookie::withValue(zend_string *_value) {
  function HttpCookie (line 141) | HttpCookie *HttpCookie::withDomain(zend_string *_domain) {
  function HttpCookie (line 145) | HttpCookie *HttpCookie::withPath(zend_string *_path) {
  function HttpCookie (line 149) | HttpCookie *HttpCookie::withSameSite(zend_string *_sameSite) {
  function HttpCookie (line 153) | HttpCookie *HttpCookie::withPriority(zend_string *_priority) {
  function HttpCookie (line 157) | HttpCookie *HttpCookie::withExpires(zend_long _expires) {
  function HttpCookie (line 162) | HttpCookie *HttpCookie::withSecure(zend_bool _secure) {
  function HttpCookie (line 167) | HttpCookie *HttpCookie::withHttpOnly(zend_bool _httpOnly) {
  function HttpCookie (line 172) | HttpCookie *HttpCookie::withPartitioned(zend_bool _partitioned) {
  function zend_string (line 177) | zend_string *HttpCookie::toString() {
  function PHP_METHOD (line 341) | static PHP_METHOD(swoole_http_cookie, __construct) {
  function PHP_METHOD (line 375) | static PHP_METHOD(swoole_http_cookie, withName) {
  function PHP_METHOD (line 379) | static PHP_METHOD(swoole_http_cookie, withValue) {
  function PHP_METHOD (line 383) | static PHP_METHOD(swoole_http_cookie, withExpires) {
  function PHP_METHOD (line 396) | static PHP_METHOD(swoole_http_cookie, withPath) {
  function PHP_
Copy disabled (too large) Download .json
Condensed preview — 2870 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (12,132K chars).
[
  {
    "path": ".clang-format",
    "chars": 3188,
    "preview": "---\nLanguage:        Cpp\n# BasedOnStyle:  Google\nAccessModifierOffset: -2\nAlignAfterOpenBracket: Align\nAlignConsecutiveA"
  },
  {
    "path": ".editorconfig",
    "chars": 665,
    "preview": "# https://editorconfig.org/\n\nroot = true\n\n[*]\ntrim_trailing_whitespace = true\ninsert_final_newline     = true\nend_of_lin"
  },
  {
    "path": ".gitattributes",
    "chars": 103,
    "preview": "/.github/ export-ignore\n/benchmark/ export-ignore\n/core-tests/ export-ignore\n*.h linguist-language=cpp\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE",
    "chars": 378,
    "preview": "Please answer these questions before submitting your issue.\n\n1. What did you do? If possible, provide a simple script fo"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 118,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/workflows/alpine.Dockerfile",
    "chars": 537,
    "preview": "ARG PHP_VERSION\nARG ALPINE_VERSION\n\nFROM phpswoole/php:${PHP_VERSION}-alpine\n\nLABEL maintainer=\"Swoole Team <team@swoole"
  },
  {
    "path": ".github/workflows/core.yml",
    "chars": 2120,
    "preview": "name: Core Tests\n\non: [ push, pull_request ]\n\nenv:\n  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}\n\njobs:\n  ubuntu:\n    ru"
  },
  {
    "path": ".github/workflows/coverity.yml",
    "chars": 2053,
    "preview": "name: coverity-scan\n\non:\n  push:\n    branches:\n      - coverity_scan\n\nenv:\n  COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_S"
  },
  {
    "path": ".github/workflows/ext.yml",
    "chars": 3233,
    "preview": "name: Compile Tests\n\non: [ push, pull_request ]\n\nenv:\n  CPPFLAGS: \"-I/opt/homebrew/opt/pcre2/include/\"\n\njobs:\n  build-ub"
  },
  {
    "path": ".github/workflows/framework.yml",
    "chars": 4355,
    "preview": "name: Framework Tests\n\non:\n  push:\n  pull_request:\n\njobs:\n  linux:\n    runs-on: ubuntu-latest\n    if: \"!contains(github."
  },
  {
    "path": ".github/workflows/iouring.yml",
    "chars": 1185,
    "preview": "name: Linux io_uring Tests\n\non: [push, pull_request]\n\njobs:\n  linux:\n    if: \"!contains(github.event.head_commit.message"
  },
  {
    "path": ".github/workflows/thread.yml",
    "chars": 1192,
    "preview": "name: Thread Support Tests\n\non: [push, pull_request]\n\njobs:\n  linux:\n    if: \"!contains(github.event.head_commit.message"
  },
  {
    "path": ".github/workflows/unit.yml",
    "chars": 3185,
    "preview": "name: Unit Tests\n\non: [push, pull_request]\n\njobs:\n  linux:\n    if: \"!contains(github.event.head_commit.message, '--filte"
  },
  {
    "path": ".gitignore",
    "chars": 1992,
    "preview": "/.cproject\n/.idea\n/.project\n*.o\n*.lo\n*~\n*.so\n*.loT\n*.pid\n*.dep\nmodules/*\n/.deps\n/.libs/\n/core\n/examples/core\n/Debug\n/Rel"
  },
  {
    "path": ".php-cs-fixer.dist.php",
    "chars": 4374,
    "preview": "<?php\n\n$header = <<<'EOF'\nThis file is part of Swoole.\n\n@link     https://www.swoole.com\n@contact  team@swoole.com\n@lice"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 8399,
    "preview": "cmake_minimum_required(VERSION 3.10)\nproject(libswoole)\n\nenable_language(ASM)\nset(SWOOLE_VERSION 6.2.0)\n\nset(CMAKE_CXX_S"
  },
  {
    "path": "Dockerfile",
    "chars": 1703,
    "preview": "# This Dockerfile is designed to create a debug version of the PHP and Swoole environment,\n # enabling ASAN (`--enable-a"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "Makefile.frag",
    "chars": 618,
    "preview": "swoole-build-coverage:\n\tCCACHE_DISABLE=1 EXTRA_CFLAGS=\"-fprofile-arcs -ftest-coverage\" EXTRA_CXXFLAGS=\"-fprofile-arcs -f"
  },
  {
    "path": "README.md",
    "chars": 23345,
    "preview": "<h2 align=center>\n<img width=\"200\" height=\"120\" alt=\"Swoole Logo\" src=\"docs/swoole-logo.svg\" /> <br />\n    Swoole is an "
  },
  {
    "path": "codecov.yml",
    "chars": 141,
    "preview": "ignore:\n  - \"src/core/error.cc\"\n  - \"thirdparty/hiredis/*\"\n  - \"thirdparty/llhttp/*\"\n\ncoverage:\n  range: 60..80\n  round:"
  },
  {
    "path": "composer.json",
    "chars": 3162,
    "preview": "{\n  \"name\": \"swoole/swoole\",\n  \"type\": \"php-ext\",\n  \"license\": \"Apache-2.0\",\n  \"description\": \"Swoole is an event-driven"
  },
  {
    "path": "config.m4",
    "chars": 60203,
    "preview": "dnl $Id$\ndnl config.m4 for extension swoole\n\ndnl  +---------------------------------------------------------------------"
  },
  {
    "path": "core-tests/.gitignore",
    "chars": 58,
    "preview": ".idea/\n.cmake/\nTesting/\nbuild.ninja\n.ninja_deps\n.ninja_log"
  },
  {
    "path": "core-tests/code-stats.sh",
    "chars": 164,
    "preview": "#!/bin/sh -e\n__CURRENT__=$(pwd)\n__DIR__=$(cd \"$(dirname \"$0\")\";pwd)\n\n# enter the dir\ncd \"${__DIR__}\"\ncloc . --exclude-di"
  },
  {
    "path": "core-tests/docker-compose.yml",
    "chars": 532,
    "preview": "version: '3.4'\nservices:\n  httpbin:\n    container_name: \"httpbin\"\n    image: \"kennethreitz/httpbin\"\n  tinyproxy:\n    con"
  },
  {
    "path": "core-tests/fuzz/project.json",
    "chars": 251,
    "preview": "{\n    \"project\": {\n        \"name\": \"fuzz\",\n        \"type\": \"bin\"\n    },\n    \"build\": {\n        \"ldflags\": \"\",\n        \"c"
  },
  {
    "path": "core-tests/fuzz/src/main.cpp",
    "chars": 876,
    "preview": "#include \"phpx_embed.h\"\n#include <iostream>\n#include <stdio.h>\n#include <unistd.h>\n#include <fcntl.h>\n\nusing namespace p"
  },
  {
    "path": "core-tests/include/httplib_client.h",
    "chars": 123927,
    "preview": "/**\n * httplib.h\n *\n * Copyright (c) 2020 Yuji Hirose. All rights reserved.\n * MIT License\n * GitHub: https://github.com"
  },
  {
    "path": "core-tests/include/httplib_server.h",
    "chars": 36221,
    "preview": "/**\n * httplib.h\n *\n * Copyright (c) 2020 Yuji Hirose. All rights reserved.\n * MIT License\n * GitHub: https://github.com"
  },
  {
    "path": "core-tests/include/redis_client.h",
    "chars": 1413,
    "preview": "#pragma once\n\n#include \"swoole.h\"\n\n#include <string>\n#include <vector>\n#include <memory>\n\n#include \"hiredis.h\"\n\nnamespac"
  },
  {
    "path": "core-tests/include/test_core.h",
    "chars": 4217,
    "preview": "#pragma once\n\n#include \"swoole_client.h\"\n#include \"swoole_socket_impl.h\"\n\n#include <gtest/gtest.h>\n\n#include <functional"
  },
  {
    "path": "core-tests/include/test_coroutine.h",
    "chars": 2000,
    "preview": "#pragma once\n\n#include \"test_core.h\"\n\n#include \"swoole_coroutine.h\"\n#include \"swoole_coroutine_channel.h\"\n#include \"swoo"
  },
  {
    "path": "core-tests/include/test_process.h",
    "chars": 635,
    "preview": "#pragma once\n\n#include <functional>\n\n#include \"test_core.h\"\n#include \"swoole_process_pool.h\"\n\nusing namespace std;\n\nname"
  },
  {
    "path": "core-tests/include/test_server.h",
    "chars": 2311,
    "preview": "#pragma once\n\n#include \"test_core.h\"\n#include \"swoole_server.h\"\n\n#define SERVER_THIS ((swoole::test::Server *) serv->pri"
  },
  {
    "path": "core-tests/js/.gitignore",
    "chars": 31,
    "preview": "node_modules\npackage-lock.json\n"
  },
  {
    "path": "core-tests/js/mqtt.js",
    "chars": 856,
    "preview": "const mqtt = require('mqtt');\nconst port = process.argv[2];\nconst pino = require('pino');\nconst logger = pino(pino.desti"
  },
  {
    "path": "core-tests/js/package.json",
    "chars": 93,
    "preview": "{\n  \"dependencies\": {\n    \"mqtt\": \"^4.3.8\",\n    \"pino\": \"^6.14.0\",\n    \"ws\": \"^8.18.2\"\n  }\n}\n"
  },
  {
    "path": "core-tests/js/ws_1.js",
    "chars": 780,
    "preview": "const WebSocket = require('ws');\nconst pino = require('pino');\nconst port = process.argv[2];\nconst logger = pino(pino.de"
  },
  {
    "path": "core-tests/js/ws_2.js",
    "chars": 560,
    "preview": "const WebSocket = require('ws');\nconst pino = require('pino');\nconst port = process.argv[2];\nconst logger = pino(pino.de"
  },
  {
    "path": "core-tests/samples/CMakeLists.txt",
    "chars": 467,
    "preview": "cmake_minimum_required(VERSION 2.8)\nproject(samples)\n#set(CMAKE_BUILD_TYPE Released)\nset(CMAKE_CXX_STANDARD 11)\nfile(GLO"
  },
  {
    "path": "core-tests/samples/src/s1.cc",
    "chars": 1131,
    "preview": "#include \"swoole.h\"\n#include \"swoole_client.h\"\n#include \"swoole_server.h\"\n#include \"swoole_coroutine.h\"\n#include \"swoole"
  },
  {
    "path": "core-tests/src/_lib/http.cpp",
    "chars": 30315,
    "preview": "#include \"test_core.h\"\n#include \"httplib_client.h\"\n#include \"swoole_http.h\"\n\nnamespace websocket = swoole::websocket;\n\nu"
  },
  {
    "path": "core-tests/src/_lib/process.cpp",
    "chars": 1208,
    "preview": "#include \"test_process.h\"\n\nusing swoole::UnixSocket;\nusing swoole::test::Process;\n\nProcess::Process(std::function<void(P"
  },
  {
    "path": "core-tests/src/_lib/redis.cpp",
    "chars": 2979,
    "preview": "#include \"redis_client.h\"\n#include \"test_core.h\"\n\n#include <memory>\n\nusing namespace std;\n\nnamespace swoole {\nbool Redis"
  },
  {
    "path": "core-tests/src/_lib/server.cpp",
    "chars": 4717,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/_lib/ssl.cpp",
    "chars": 2494,
    "preview": "#include \"test_core.h\"\n\nnamespace swoole {\nnamespace test {\nvoid printAllSubjectEntries(X509_NAME *name) {\n    if (!name"
  },
  {
    "path": "core-tests/src/core/base.cpp",
    "chars": 16154,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/core/channel.cpp",
    "chars": 3793,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/core/hash.cpp",
    "chars": 2282,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/core/heap.cpp",
    "chars": 810,
    "preview": "#include \"test_core.h\"\n#include \"swoole_heap.h\"\n#include <map>\n\ntypedef struct node_t {\n    int pri;\n    int val;\n} node"
  },
  {
    "path": "core-tests/src/core/log.cpp",
    "chars": 9231,
    "preview": "#include \"test_core.h\"\n#include \"swoole_file.h\"\n#include \"swoole_process_pool.h\"\n#include <regex>\n#include <vector>\n\nusi"
  },
  {
    "path": "core-tests/src/core/string.cpp",
    "chars": 9446,
    "preview": "#include \"test_core.h\"\n#include \"swoole_util.h\"\n\nusing namespace std;\nusing swoole::String;\n\nTEST(string, ltrim) {\n    c"
  },
  {
    "path": "core-tests/src/core/time.cpp",
    "chars": 735,
    "preview": "#include \"test_core.h\"\n#include \"swoole_util.h\"\n\nTEST(time, get_ms) {\n    const int us = 3000;\n    long ms1 = swoole::ti"
  },
  {
    "path": "core-tests/src/core/util.cpp",
    "chars": 1602,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/coroutine/accept.cpp",
    "chars": 3987,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/coroutine/async.cpp",
    "chars": 2750,
    "preview": "#include \"test_coroutine.h\"\n#include \"swoole_async.h\"\n\n#include <iostream>\n#include <regex>\n\nusing namespace std;\nusing "
  },
  {
    "path": "core-tests/src/coroutine/base.cpp",
    "chars": 10329,
    "preview": "#include \"test_coroutine.h\"\n\nusing namespace swoole;\nusing swoole::coroutine::System;\n\nTEST(coroutine_base, create) {\n  "
  },
  {
    "path": "core-tests/src/coroutine/channel.cpp",
    "chars": 4104,
    "preview": "#include \"test_coroutine.h\"\n\nusing swoole::Coroutine;\nusing swoole::coroutine::Channel;\n\nusing namespace std;\nusing name"
  },
  {
    "path": "core-tests/src/coroutine/file.cpp",
    "chars": 2112,
    "preview": "/*\n +----------------------------------------------------------------------+\n | Swoole                                  "
  },
  {
    "path": "core-tests/src/coroutine/gethostbyname.cpp",
    "chars": 2552,
    "preview": "#include \"test_coroutine.h\"\n\nusing swoole::Coroutine;\nusing swoole::Timer;\nusing swoole::coroutine::System;\nusing swoole"
  },
  {
    "path": "core-tests/src/coroutine/hook.cpp",
    "chars": 24752,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/coroutine/http_server.cpp",
    "chars": 3511,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/coroutine/iouring.cpp",
    "chars": 14790,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/coroutine/socket.cpp",
    "chars": 53520,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/coroutine/system.cpp",
    "chars": 14421,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/coroutine/uring_socket.cpp",
    "chars": 18657,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/lock/lock.cpp",
    "chars": 6582,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/main.cpp",
    "chars": 8946,
    "preview": "#include \"test_core.h\"\n#include \"swoole_memory.h\"\n\n#include <dirent.h>\n#include <system_error>\n\nusing namespace swoole;\n"
  },
  {
    "path": "core-tests/src/memory/buffer.cpp",
    "chars": 2911,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/memory/fixed_pool.cpp",
    "chars": 2246,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/memory/global_memory.cpp",
    "chars": 1968,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/memory/lru_cache.cpp",
    "chars": 2424,
    "preview": "#include \"test_core.h\"\n#include \"swoole_lru_cache.h\"\n\nusing namespace swoole;\nusing namespace std;\n\nint dtor_num = 0;\ncl"
  },
  {
    "path": "core-tests/src/memory/ringbuffer.cpp",
    "chars": 3213,
    "preview": "#include \"test_core.h\"\n#include \"swoole_memory.h\"\n#include \"swoole_pipe.h\"\n\nusing namespace swoole;\n\n#include <thread>\n\n"
  },
  {
    "path": "core-tests/src/memory/table.cpp",
    "chars": 11539,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/network/address.cpp",
    "chars": 5198,
    "preview": "/*\n+----------------------------------------------------------------------+\n  | Swoole                                  "
  },
  {
    "path": "core-tests/src/network/client.cpp",
    "chars": 30127,
    "preview": "#include \"test_core.h\"\n#include \"test_server.h\"\n#include \"test_process.h\"\n#include \"core-tests/include/test_core.h\"\n\n#in"
  },
  {
    "path": "core-tests/src/network/dns.cpp",
    "chars": 8109,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/network/socket.cpp",
    "chars": 26407,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/network/stream.cpp",
    "chars": 4059,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/os/async.cpp",
    "chars": 4883,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/os/file.cpp",
    "chars": 5300,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/os/msg_queue.cpp",
    "chars": 2446,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/os/os.cpp",
    "chars": 3121,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/os/pipe.cpp",
    "chars": 1225,
    "preview": "#include \"test_core.h\"\n#include \"swoole_pipe.h\"\n\nusing namespace swoole;\n\nTEST(pipe, unixsock) {\n    UnixSocket p(true, "
  },
  {
    "path": "core-tests/src/os/process_pool.cpp",
    "chars": 18934,
    "preview": "#include \"test_core.h\"\n#include \"swoole_process_pool.h\"\n\n#include <csignal>\n\n#ifdef __MACH__\n#define sysv_signal signal\n"
  },
  {
    "path": "core-tests/src/os/signal.cpp",
    "chars": 3313,
    "preview": "#include \"test_core.h\"\n#include \"swoole_process_pool.h\"\n#include \"swoole_signal.h\"\n\n#ifdef HAVE_SIGNALFD\nstatic void sig"
  },
  {
    "path": "core-tests/src/os/timer.cpp",
    "chars": 6360,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/os/wait.cpp",
    "chars": 2008,
    "preview": "#include \"test_coroutine.h\"\n\nusing namespace swoole;\nusing namespace swoole::test;\nusing swoole::coroutine::System;\n\nsta"
  },
  {
    "path": "core-tests/src/protocol/base.cpp",
    "chars": 20073,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/protocol/base64.cpp",
    "chars": 1692,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/protocol/http2.cpp",
    "chars": 21651,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/protocol/mime_type.cpp",
    "chars": 2163,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/protocol/redis.cpp",
    "chars": 5146,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/protocol/ssl.cpp",
    "chars": 2887,
    "preview": "/*\n+----------------------------------------------------------------------+\n  | Swoole                                  "
  },
  {
    "path": "core-tests/src/reactor/base.cpp",
    "chars": 20828,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/server/buffer.cpp",
    "chars": 2724,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/server/http_parser.cpp",
    "chars": 42381,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/server/http_server.cpp",
    "chars": 62035,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/server/message_bus.cpp",
    "chars": 6629,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/server/mqtt.cpp",
    "chars": 9679,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/server/multipart_parser.cpp",
    "chars": 10142,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "core-tests/src/server/port.cpp",
    "chars": 2499,
    "preview": "/*\n+----------------------------------------------------------------------+\n  | Swoole                                  "
  },
  {
    "path": "core-tests/src/server/server.cpp",
    "chars": 127867,
    "preview": "/*\n  +----------------------------------------------------------------------+\n  | Swoole                                "
  },
  {
    "path": "docs/API.md",
    "chars": 3396,
    "preview": "## Basic C API\nThese functions enable you to obtain the spool version and insert some hooks into the spool,\nsuch as `SW_"
  },
  {
    "path": "docs/CHANGELOG.md",
    "chars": 10316,
    "preview": "# Swoole Changelog\n\n## 2024-12-16 v6.0.0\n# ✨ New Feature:\n- Added multi-threading support, require the ZTS version of PH"
  },
  {
    "path": "docs/CODE-STYLE.md",
    "chars": 113,
    "preview": "Code Style\n=======\n* Google C++ Style\n* Indent adjusted to 4 characters\n* Line width adjusted to 120 characters\n\n"
  },
  {
    "path": "docs/CPPLINT.cfg",
    "chars": 152,
    "preview": "set noparent\nfilter=-build/include_alpha,-build/include_subdir,-build/include_what_you_use,-legal/copyright,-readability"
  },
  {
    "path": "docs/ISSUE.md",
    "chars": 3659,
    "preview": "# Bug reports\n\n## Instruction\n\nIf you think you have found a bug in Swoole, please report it.\nThe Swoole developers prob"
  },
  {
    "path": "docs/SUPPORTED.md",
    "chars": 2489,
    "preview": "## Supported Versions\n\n| Branch                                                     | PHP Version | Initialization | Act"
  },
  {
    "path": "docs/TESTS.md",
    "chars": 2111,
    "preview": "## Swoole Tests\n\n## Core Tests\nUsed to test the core code in the `src/` directory, only as a C++ library, not related to"
  },
  {
    "path": "docs/WORKFLOW-PARAMETERS.md",
    "chars": 592,
    "preview": "# Workflow Parameters\nAdding parameters in the Git commit log can control the workflow.\n\n## --filter\nThis parameter spec"
  },
  {
    "path": "docs/google-style.xml",
    "chars": 17613,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<profiles version=\"1\">\n<profile kind=\"CodeFormatterProfile\" name="
  },
  {
    "path": "docs/sponsors.md",
    "chars": 2792,
    "preview": "<hr id=\"title1\" />\n\n# [成为 Swoole 的赞助者](#title1) \n---\n\nSwoole 是采用 Apache 许可的开源项目,是完全免费的。\n\n维护这样一个庞大的生态系统和为项目开发新功能所需的巨大努力,只"
  },
  {
    "path": "examples/atomic/long.php",
    "chars": 212,
    "preview": "<?php\n$l = new Swoole\\Atomic\\Long( -2 ** 36);\necho $l->get().\"\\n\";\necho $l->add(20).\"\\n\";\necho $l->sub(20).\"\\n\";\necho $l"
  },
  {
    "path": "examples/atomic/test.php",
    "chars": 196,
    "preview": "<?php\n$atomic = new Swoole\\Atomic(123);\necho $atomic->add(12).\"\\n\";\necho $atomic->sub(11).\"\\n\";\necho $atomic->cmpset(122"
  },
  {
    "path": "examples/atomic/wait.php",
    "chars": 201,
    "preview": "<?php\n$n = new Swoole\\Atomic(0);\n\nif (pcntl_fork() > 0)\n{\n\techo \"master start\\n\";\n\t$n->wait(1.5);\n\techo \"master end\\n\";\n"
  },
  {
    "path": "examples/client/c10k.php",
    "chars": 642,
    "preview": "<?php\n$clients = array();\nfor ($j = 0; $j < 2; $j++) {\n    $pid = pcntl_fork();\n    if ($pid > 0) {\n        continue;\n  "
  },
  {
    "path": "examples/client/get_socket.php",
    "chars": 692,
    "preview": "<?php\n\nfunction getClient()\n{\n    $client = new Swoole\\Client(SWOOLE_SOCK_TCP);\n    if (!$client->connect('127.0.0.1', 9"
  },
  {
    "path": "examples/client/long_tcp.php",
    "chars": 334,
    "preview": "<?php\nfor($i=0; $i < 100; $i++)\n{\n\t$client = new Swoole\\Client(SWOOLE_TCP | SWOOLE_KEEP);\n\tif(!$client->connect('127.0.0"
  },
  {
    "path": "examples/client/recv_1m.php",
    "chars": 451,
    "preview": "<?php\n$c = new Swoole\\Client(SWOOLE_TCP);\n$f = fopen('data.log', 'w');\n$c->connect('127.0.0.1', 9509, 60);\n$c->send(\"AAA"
  },
  {
    "path": "examples/client/recv_file.php",
    "chars": 875,
    "preview": "<?php\nif (empty($argv[1])) {\n    $server_ip = '127.0.0.1';\n} else {\n    $server_ip = $argv[1];\n}\n$cli = new Swoole\\Clien"
  },
  {
    "path": "examples/client/select.php",
    "chars": 703,
    "preview": "<?php\n$clients = array();\n\nfor ($i = 0; $i < 20; $i++) {\n    $client = new Swoole\\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SY"
  },
  {
    "path": "examples/client/simple.php",
    "chars": 477,
    "preview": "<?php\n$clients = array();\nfor ($i = 0; $i < 1; $i++) {\n    $client = new Swoole\\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC"
  },
  {
    "path": "examples/client/sync.php",
    "chars": 631,
    "preview": "<?php\n$client = new Swoole\\Client(SWOOLE_SOCK_TCP);\n$count = 0;\n//$client->set(array('open_eof_check' => true, 'package_"
  },
  {
    "path": "examples/client/test.txt",
    "chars": 334,
    "preview": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  },
  {
    "path": "examples/client/udp_sync.php",
    "chars": 214,
    "preview": "<?php\n$client = new Swoole\\Client(SWOOLE_SOCK_UDP, SWOOLE_SOCK_SYNC);\n$client->connect('127.0.0.1', 9502);\n\nfor ($i = 0;"
  },
  {
    "path": "examples/coroutine/backtrace.php",
    "chars": 1448,
    "preview": "<?php\nfunction test1() {\n    test2();\n}\n\nfunction test2() {\n    while(true) {\n        co::sleep(10);\n        echo __FUNC"
  },
  {
    "path": "examples/coroutine/before_server_start.php",
    "chars": 567,
    "preview": "<?php\ngo(function ()\n{\n    co::sleep(1);\n\n    $http = new Swoole\\Http\\Server(\"127.0.0.1\", 9501, SWOOLE_BASE);\n\n    $http"
  },
  {
    "path": "examples/coroutine/behavior/do-while.php",
    "chars": 278,
    "preview": "<?php\nSwoole\\Coroutine::set([\n    'max_death_ms' => 2000,\n    'death_loop_threshold' => 5,\n]);\necho \"start\\n\";\ngo(functi"
  },
  {
    "path": "examples/coroutine/behavior/for.php",
    "chars": 519,
    "preview": "<?php\nco::set(['enable_preemptive_scheduler' => true]);\n$start = microtime(1);\necho \"start\\n\";\n$flag = 1;\n\ngo(function ("
  },
  {
    "path": "examples/coroutine/behavior/foreach.php",
    "chars": 207,
    "preview": "<?php\necho \"start\\n\";\ngo(function () {\n    echo \"coro start\\n\";\n    $arr = range(0, 20);\n    foreach($arr as $k=>$v){\n  "
  },
  {
    "path": "examples/coroutine/behavior/goto.php",
    "chars": 182,
    "preview": "<?php\necho \"start\\n\";\ngo(function () {\n    echo \"coro start\\n\";\n    loop:\n    echo \"111\\n\";\n    sleep(1);\n    goto loop;"
  },
  {
    "path": "examples/coroutine/behavior/preemptive_timer.php",
    "chars": 682,
    "preview": "<?php\nco::set(['enable_preemptive_scheduler' => true]);\ngo(function (){\n    $exit = false;\n    while (true){\n        $re"
  },
  {
    "path": "examples/coroutine/behavior/tick.php",
    "chars": 627,
    "preview": "<?php\ndeclare(ticks=10);\n\n$max_msec = 10;\nSwoole\\Coroutine::set([\n    'max_exec_msec' => $max_msec,\n]);\n\n$s = microtime("
  },
  {
    "path": "examples/coroutine/behavior/while.php",
    "chars": 537,
    "preview": "<?php\nSwoole\\Coroutine::set([\n    'max_death_ms' => 5000,\n]);\n$s = microtime(1);\necho \"start\\n\";\ngo(function () {\n    ec"
  },
  {
    "path": "examples/coroutine/behavior/while2.php",
    "chars": 451,
    "preview": "<?php\nSwoole\\Coroutine::set([\n    'max_death_ms' => 5000,\n]);\n$s = microtime(1);\necho \"start\\n\";\n\n$flag = 1;\ngo(function"
  },
  {
    "path": "examples/coroutine/cancel_throw.php",
    "chars": 287,
    "preview": "<?php\nCo\\run(function () {\n    $cid = Co\\go(function () {\n            while (true) {\n                sleep(1);\n         "
  },
  {
    "path": "examples/coroutine/channel/test.php",
    "chars": 731,
    "preview": "<?php\nfunction BatchExecMethodByCo()\n{\n    $args = func_get_args();\n    $channel = new \\Swoole\\Coroutine\\Channel(count($"
  },
  {
    "path": "examples/coroutine/client_send_yield.php",
    "chars": 623,
    "preview": "<?php\ngo(function () {\n    $client = new Swoole\\Coroutine\\Client(SWOOLE_SOCK_TCP);\n    $client->set(array(\n        'sock"
  },
  {
    "path": "examples/coroutine/client_send_yield_server.php",
    "chars": 643,
    "preview": "<?php\n$socket = stream_socket_server(\"tcp://0.0.0.0:9501\", $errno, $errstr);\nif (!$socket) {\n    echo \"$errstr ($errno)<"
  },
  {
    "path": "examples/coroutine/coro_array_map.php",
    "chars": 448,
    "preview": "<?php\n\nuse Swoole\\Coroutine as co;\n\nco::create(function() {\n    array_map(\"test\",array(\"func param\\n\"));\n    echo \"co fl"
  },
  {
    "path": "examples/coroutine/coro_call_user.php",
    "chars": 377,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\nco::set(['trace_flags' => 1]);\n\nco::create(function() {\n    echo \"co func start\\n\";\n  "
  },
  {
    "path": "examples/coroutine/coro_channel.php",
    "chars": 635,
    "preview": "<?php\n$http = new Swoole\\Http\\Server(\"127.0.0.1\", 9501, SWOOLE_BASE);\n$http->set(array(\n    'log_file' => '/dev/null'\n))"
  },
  {
    "path": "examples/coroutine/coro_destruct.php",
    "chars": 385,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\nclass T\n{\n    function __construct()\n    {\n\n    }\n\n    function test()\n    {\n        e"
  },
  {
    "path": "examples/coroutine/coro_destuct.php",
    "chars": 656,
    "preview": "<?php\nrequire __DIR__ . \"/coro_include.php\";\n\nclass T\n{\n    function __construct()\n    {\n        echo \"call __construct "
  },
  {
    "path": "examples/coroutine/coro_empty.php",
    "chars": 121,
    "preview": "<?php\n// co::set(['trace_flags' => 1]);\n\nco::create(function () {\n    echo \"no coro exit\\n\";\n});\necho \"exec file end\\n\";"
  },
  {
    "path": "examples/coroutine/coro_gethost.php",
    "chars": 197,
    "preview": "<?php\nrequire __DIR__ . \"/coro_include.php\";\nuse Swoole\\Coroutine as co;\n\nco::create(function () {\n    $ip = co::gethost"
  },
  {
    "path": "examples/coroutine/coro_include.php",
    "chars": 154,
    "preview": "<?php\nif (substr(PHP_OS, 0, 3) == 'WIN')\n{\n    exit(\"skip for Windows\");\n}\nif (!extension_loaded(\"swoole\"))\n{\n    exit(\""
  },
  {
    "path": "examples/coroutine/coro_invoke.php",
    "chars": 411,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\nco::set(['trace_flags' => 1]);\n\nco::create(function() {\n\n\n    $function = new Reflecti"
  },
  {
    "path": "examples/coroutine/coro_nested.php",
    "chars": 526,
    "preview": "<?php\nrequire __DIR__ . \"/coro_include.php\";\necho \"before coro\\n\";\ngo(function () {\n    echo \"co[1] start\\n\";\n\n    $clie"
  },
  {
    "path": "examples/coroutine/coro_nested_empty.php",
    "chars": 315,
    "preview": "<?php\nrequire __DIR__ . \"/coro_include.php\";\nfunction test()\n{\n    echo \"before coro\\n\";\n    go(function () {\n        ec"
  },
  {
    "path": "examples/coroutine/coro_serialize.php",
    "chars": 838,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\nclass Obj {\n  public $a;\n  protected $b;\n  private $c;\n  var $d;\n\n  function __constru"
  },
  {
    "path": "examples/coroutine/coro_set_stack_size.php",
    "chars": 183,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\n\nco::set(['stack_size' => 1024*1024*4]);\n\nco::create(function () {\n    var_dump(co::st"
  },
  {
    "path": "examples/coroutine/coro_sleep.php",
    "chars": 198,
    "preview": "<?php\n// require  __DIR__ . \"/coro_include.php\";\nuse Swoole\\Coroutine as co;\nco::create(function () {\n    echo \"start\\n\""
  },
  {
    "path": "examples/coroutine/coro_stackless.php",
    "chars": 517,
    "preview": "<?php\nrequire __DIR__ . \"/coro_include.php\";\nuse Swoole\\Coroutine as co;\n\necho \"start\\n\";\nco::create(function () {\n    $"
  },
  {
    "path": "examples/coroutine/coro_util.php",
    "chars": 338,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\n\n$id = go(function(){\n    $id = co::getUid();\n    echo \"start coro $id\\n\";\n    co::sus"
  },
  {
    "path": "examples/coroutine/csp.php",
    "chars": 1413,
    "preview": "<?php\n$serv = new \\Swoole\\Http\\Server(\"127.0.0.1\", 9503, SWOOLE_BASE);\n\n$serv->on('request', function ($req, $resp) {\n  "
  },
  {
    "path": "examples/coroutine/deadlock.php",
    "chars": 170,
    "preview": "<?php\n$lock = new Swoole\\Lock();\n$c = 2;\n\nwhile ($c--) {\n    go(function () use ($lock) {\n        $lock->lock();\n       "
  },
  {
    "path": "examples/coroutine/defer.php",
    "chars": 434,
    "preview": "<?php\ngo(function () {\n\n    defer(function () {\n        co::sleep(1);\n        echo \"end 2\\n\";\n\n        defer(function ()"
  },
  {
    "path": "examples/coroutine/defer_client.php",
    "chars": 2266,
    "preview": "<?php\n/* new multi implement test */\n$server = new Swoole\\Http\\Server(\"127.0.0.1\", 9502, SWOOLE_BASE);\n\n$server->set([\n\t"
  },
  {
    "path": "examples/coroutine/enable_coroutine.php",
    "chars": 699,
    "preview": "<?php\n\nuse Swoole\\Http\\Request;\nuse Swoole\\Http\\Response;\n\n$http = new Swoole\\Http\\Server('127.0.0.1', 9501);\n\n$http->se"
  },
  {
    "path": "examples/coroutine/exception/empty.php",
    "chars": 326,
    "preview": "<?php\ngo(function () {\n    try {\n        echo \"before\\n\";\n        co::sleep(0.5);\n        echo \"after\\n\";\n        throw "
  },
  {
    "path": "examples/coroutine/exec.php",
    "chars": 57,
    "preview": "<?php\ngo(function () {\n\n\tvar_dump(co::exec(\"ls /\"));\n});\n"
  },
  {
    "path": "examples/coroutine/exit_in_coroutine.php",
    "chars": 361,
    "preview": "<?php\nfunction route()\n{\n    controller();\n}\n\nfunction controller()\n{\n    your_code();\n}\n\nfunction your_code()\n{\n    co:"
  },
  {
    "path": "examples/coroutine/exit_with_status.php",
    "chars": 232,
    "preview": "<?php\n$exit_status = 0;\ngo(function () {\n    try {\n        exit(123);\n    } catch (\\Swoole\\ExitException $e) {\n        g"
  },
  {
    "path": "examples/coroutine/fgets.php",
    "chars": 456,
    "preview": "<?Php\n$fp = fopen(__DIR__ . \"/defer_client.php\", \"r\");\nstream_set_chunk_size($fp, 1024);\n\ngo(function () use ($fp)\n{\n   "
  },
  {
    "path": "examples/coroutine/fread.php",
    "chars": 189,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\n\n$fp = fopen(__DIR__ . \"/defer_client.php\", \"r\");\n\nco::create(function () use ($fp)\n{\n"
  },
  {
    "path": "examples/coroutine/fwrite.php",
    "chars": 183,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\n\n$fp = fopen(__DIR__ . \"/test.data\", \"a+\");\n\nco::create(function () use ($fp)\n{\n    $r"
  },
  {
    "path": "examples/coroutine/gethostbyname.php",
    "chars": 131,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\n\nco::create(function() {\n    $ip = co::gethostbyname(\"www.baidu.com\");\n    echo \"IP: $"
  },
  {
    "path": "examples/coroutine/http/server.php",
    "chars": 1102,
    "preview": "<?php\nCo::set([\n    'trace_flags' => SWOOLE_TRACE_HTTP2,\n    'log_level' => 0,\n]);\ngo(function () {\n\t$server = new Co\\Ht"
  },
  {
    "path": "examples/coroutine/http/write_func.php",
    "chars": 360,
    "preview": "<?php\nCo::set([\n    'trace_flags' => SWOOLE_TRACE_HTTP2,\n    'log_level' => 0,\n]);\nCo\\run(function () {\n\t$client = new S"
  },
  {
    "path": "examples/coroutine/http2_client.php",
    "chars": 2199,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\n\nconst TEST = array('get', 'post', 'pipeline');\n//const TEST = array('pipeline');\n//co"
  },
  {
    "path": "examples/coroutine/http_backend_serv.php",
    "chars": 775,
    "preview": "<?php\n/**\n * @Author: syyuanyizhi@163.com\n    connect refuse: errorCode  111\n    I/O     timeout:errorCode  110\n    http"
  },
  {
    "path": "examples/coroutine/http_client.php",
    "chars": 449,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\nco::create(function () {\n    $cli = new co\\http\\client('127.0.0.1', 9501);\n    $cli->s"
  },
  {
    "path": "examples/coroutine/http_download.php",
    "chars": 409,
    "preview": "<?php\n\nuse Swoole\\Coroutine\\Http\\Client;\n\nCo\\run(function () {\n    $host = 'www.swoole.com';\n    $cli = new Client($host"
  },
  {
    "path": "examples/coroutine/http_server.php",
    "chars": 906,
    "preview": "<?php\nini_set(\"memory_limit\",\"512M\");\nuse Swoole\\Coroutine as co;\nclass Server\n{\n    public $server;\n    public $redisPo"
  },
  {
    "path": "examples/coroutine/httpmulti.php",
    "chars": 6117,
    "preview": "<?php\n/**\n * @Author: syyuanyizhi@163.com\n    connect refuse: errorCode  111\n    I/O     timeout:errorCode  110\n    http"
  },
  {
    "path": "examples/coroutine/join.php",
    "chars": 791,
    "preview": "<?php\n\nuse function Swoole\\Coroutine\\run;\nuse function Swoole\\Coroutine\\go;\nuse Swoole\\Coroutine;\nuse Swoole\\Coroutine\\S"
  },
  {
    "path": "examples/coroutine/library/base.php",
    "chars": 934,
    "preview": "<?php\nclass R\n{\n    public function __construct()\n    {\n        $cid = \\Swoole\\Coroutine::getCid();\n        echo \"cid:$c"
  },
  {
    "path": "examples/coroutine/list_coroutines.php",
    "chars": 400,
    "preview": "<?php\nforeach(range(1, 100) as $i) {\n    go(function () use ($i) {\n        if ($i % 9 == 7) {\n            return;\n      "
  },
  {
    "path": "examples/coroutine/mysql_chan.php",
    "chars": 610,
    "preview": "<?php\n\nuse Swoole\\Coroutine as co;\n\n$chan = new chan(4);\n\ngo(function () use ($chan) {\n\n    $db = new co\\MySQL();\n    $s"
  },
  {
    "path": "examples/coroutine/mysql_escape.php",
    "chars": 323,
    "preview": "<?php\n\ngo(function(){\n    $swoole_mysql = new \\Swoole\\Coroutine\\MySQL();\n    \n    $swoole_mysql->connect([\n        'host"
  },
  {
    "path": "examples/coroutine/mysql_execute_empty.php",
    "chars": 342,
    "preview": "<?php\ngo(function () {\n    $db = new Swoole\\Coroutine\\Mysql;\n    $server = [\n        'host'     => '127.0.0.1',\n        "
  },
  {
    "path": "examples/coroutine/mysql_prepare.php",
    "chars": 893,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\n\nco::create(function() {\n\n    $db = new co\\MySQL();\n    $server = array(\n        'host"
  },
  {
    "path": "examples/coroutine/mysql_prepare_2.php",
    "chars": 425,
    "preview": "<?php\n\n\ngo(function() {\n\n    $db = new Co\\MySQL();\n    $server = array(\n        'host' => '127.0.0.1',\n        'user' =>"
  },
  {
    "path": "examples/coroutine/mysql_procedure_exec.php",
    "chars": 681,
    "preview": "<?php\n\ngo(function () {\n    $db = new Swoole\\Coroutine\\Mysql;\n    $server = [\n        'host' => '127.0.0.1',\n        'us"
  },
  {
    "path": "examples/coroutine/mysql_query.php",
    "chars": 437,
    "preview": "<?php\nuse Swoole\\Coroutine as co;\nco::set(['trace_flags' => 1]);\n\nco::create(function() {\n\n\n    $function = new Reflecti"
  },
  {
    "path": "examples/coroutine/mysql_unixsocket.php",
    "chars": 362,
    "preview": "<?php\n\ngo(function(){\n    $db = new Swoole\\Coroutine\\Mysql;\n    $server = [\n        'host'     => 'unix:/tmp/mysql.sock'"
  },
  {
    "path": "examples/coroutine/pdo/pdo_persistent.phpt",
    "chars": 383,
    "preview": "<?php\nCo\\run(function () {\n    $pdo = new PDO(\n        \"mysql:host=\" . MYSQL_SERVER_HOST . \";port=\" . MYSQL_SERVER_PORT "
  },
  {
    "path": "examples/coroutine/proc_open.php",
    "chars": 441,
    "preview": "<?php\nSwoole\\Runtime::setHookFlags(SWOOLE_HOOK_ALL);\nSwoole\\Coroutine\\run(function () {\n\n    $descriptorspec = array(\n  "
  },
  {
    "path": "examples/coroutine/reconnect_test.php",
    "chars": 1882,
    "preview": "<?php\n/* new multi implement test */\n$server = new Swoole\\Http\\Server(\"127.0.0.1\", 9502, SWOOLE_BASE);\n\n$server->set([\n\t"
  },
  {
    "path": "examples/coroutine/redis/auth.php",
    "chars": 213,
    "preview": "<?php\ngo(function () {\n    $redis = new Swoole\\Coroutine\\Redis;\n    $redis->connect('127.0.0.1', 6379);\n    $redis->auth"
  },
  {
    "path": "examples/coroutine/redis/defer.php",
    "chars": 518,
    "preview": "<?php\n\nconst REDIS_SERVER_HOST = '127.0.0.1';\nconst REDIS_SERVER_PORT = 6379;\n\n\ngo(function () {\n    $redis = new Swoole"
  },
  {
    "path": "examples/coroutine/redis/eval.php",
    "chars": 173,
    "preview": "<?php\ngo(function (){\n    $redis = new Co\\Redis;\n    $redis->connect('127.0.0.1', 6379);\n    $res = $redis->eval(\"return"
  },
  {
    "path": "examples/coroutine/redis/get.php",
    "chars": 233,
    "preview": "<?php\ngo(function (){\n\t$redis = new CO\\Redis;\n\tvar_dump($redis->connect(\"127.0.0.1\", 6379));\n\tvar_dump($redis->get(\"key\""
  },
  {
    "path": "examples/coroutine/redis/multi.php",
    "chars": 388,
    "preview": "<?php\nconst REDIS_SERVER_HOST = '127.0.0.1';\nconst REDIS_SERVER_PORT = 6379;\n\n\ngo(function () {\n    $redis = new Swoole\\"
  },
  {
    "path": "examples/coroutine/redis/pipeline.php",
    "chars": 385,
    "preview": "<?php\nconst REDIS_SERVER_HOST = '127.0.0.1';\nconst REDIS_SERVER_PORT = 6379;\n\n\ngo(function () {\n    $redis = new Swoole\\"
  },
  {
    "path": "examples/coroutine/redis/pub.php",
    "chars": 205,
    "preview": "<?php\ngo(function () {\n\n$redis = new Swoole\\Coroutine\\Redis();\n$redis->connect('127.0.0.1', 6379);\nwhile (true) \n{\n\t$msg"
  },
  {
    "path": "examples/coroutine/redis/request.php",
    "chars": 174,
    "preview": "<?php\ngo(function () {\n    $redis = new Co\\Redis;\n    $redis->connect('127.0.0.1', 6379);\n    $res = $redis->request(['o"
  }
]

// ... and 2670 more files (download for full content)

About this extraction

This page contains the full source code of the swoole/swoole-src GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2870 files (10.9 MB), approximately 3.0M tokens, and a symbol index with 7256 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!