Code Tu Tam

Các câu hỏi thường gặp về Open Swoole

Rate this post

HTTPS/SSL and Linux kernel

Open Swoole TLS và HTTPS

1. Cách Tạo chứng chỉ SSL với mkcert

Bạn có thể sử dụng mkcert để tạo chứng chỉ SSL và thiết lập CA tại môi trường phát triển cục bộ của bạn.

mkcert -install

# Created a new local CA 💥
# The local CA is now installed in the system trust store! ⚡️
# The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊

mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1

#Created a new certificate valid for the following names 📜
# - "example.com"
# - "*.example.com"
# - "example.test"
# - "localhost"
# - "127.0.0.1"
# - "::1"

# The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅

2. Cách bật HTTPS tại Open Swoole Server?

Bạn có thể bật SSL cho máy chủ HTTP hoặc máy chủ HTTP2, máy chủ WebSocket với các cài đặt sau:

<?php
$server->set([
    'ssl_cert_file' => __DIR__ . '/config/example.com+5.pem',
    'ssl_key_file' => __DIR__ . '/config/example.com+5-key.pem'
]);

Bạn có thể tìm thấy các cấu hình SSL khác tại Open Swoole Server Configuration.

Bạn phải vượt qua SWOOLE_SSL khi xác định máy chủ Open Swoole để bật SSL:

$server = new Swoole\Server("0.0.0.0", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);

Open Swoole Linux Kernel Tunning

1. Cài đặt Linux ulimit

# /etc/security/limits.conf

* soft nofile 262140
* hard nofile 262140
root soft nofile 262140
root hard nofile 262140
* soft core unlimited
* hard core unlimited
root soft core unlimited
root hard core unlimited

2.Cài đặt Linux sysctl

# /etc/sysctl.conf

# socket buffer
net.ipv4.tcp_mem  =   379008       505344  758016
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_rmem = 4096          87380   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# ipv4
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=81920
net.ipv4.tcp_synack_retries=3
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 20000 65000
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.route.max_size = 5242880

Làm thế nào để duy trì một kết nối TCP đang hoạt động lâu dài?

Với OpenSwoole, bạn có thể thiết lập máy chủ TCP hoặc máy chủ HTTP và sử dụng các tùy chọn cấu hình sau để duy trì kết nối TCP đang hoạt động lâu dài:

Gọi đến hàm không xác định Co \ run ()

Tất cả các quy trình trong OpenSwoole cần được bao bọc bên trong một ngữ cảnh chương trình đăng ký, ngữ cảnh này được tạo tự động cho bạn khi bạn sử dụng Máy chủ HTTP chẳng hạn.

Tuy nhiên, nếu bạn nhận được lỗi thông báo Lỗi chưa xác định: Uncaught Error: Call to undefined function Co\run() or Uncaught Error: Call to undefined function go() bạn phải đảm bảo rằng bạn đang sử dụng phiên bản v4.4.0 trở lên hoặc bạn đã include the namespace Swoole\Coroutine.

Bạn cũng có thể sử dụng Swoole\Coroutine::create(callable $function, …$args): int|false là một thay thế cho go ().

Tôi có thể chia sẻ kết nối Redis hoặc MySQL không?

Không, không thể chia sẻ một kết nối (Redis hoặc MySQL) giữa nhiều coroutines. Không thể đọc hoặc ghi cùng một lúc bằng một kết nối.

Bạn không thể chia sẻ kết nối nhưng bạn có thể giữ chúng mở hoặc chạy qua một nhóm kết nối. Một nhóm kết nối cho phép bạn lưu trữ nhiều kết nối có thể được sử dụng bởi nhiều coroutines và khôi phục lại khi chúng đã được sử dụng và không còn cần thiết nữa, bạn có thể đọc thêm về các nhóm kết nối tại đây.

My connection has been closed errors

Khi sử dụng OpenSwoole, đặc biệt là Máy chủ HTTP, bạn có thể gặp các thông báo sau trong bảng điều khiển:

NOTICE swFactoryProcess_finish (ERRNO 1004): send 165 byte failed, because connection[fd=123] is closed

NOTICE swFactoryProcess_finish (ERROR 1005): connection[fd=123] does not exists

Khi nhìn thấy những thông báo này, chúng chỉ là thông báo và không có gì phải lo lắng. Những thông báo này được hiển thị do một trong những điều sau:

Lỗi kết nối bị hủy ( Discarded Connection Errors )

WARNING swWorker_discard_data (ERRNO 1007): [2] received the wrong data[21 bytes] from socket#75

WARNING Worker_discard_data (ERRNO 1007): [2] ignore data[5 bytes] received from session#2

Đây là điều bạn nên xem xét, các lỗi ở trên có nghĩa là bạn có một số lượng lớn kết nối bị ngắt kết nối và có thể cần phải kiểm tra cấu hình của mình với tùy chọn discard_timeout_request cho server.

Kết nối bị từ chối (Connection Refused)

Nếu bạn nhận được lỗi bị từ chối kết nối trên trình duyệt hoặc ứng dụng khách của mình, điều đó có thể có nghĩa là bạn đang không truy cập đúng địa chỉ IP hoặc cổng mà máy chủ OpenSwoole của bạn đang chạy.

Không có tài nguyên (Resource temporarily unavailable)

Lỗi này thường đề cập đến mô-đun Swoole \ Client.

Khi gặp lỗi sau:

swoole_client::recv(): recv() failed. Error: Resource temporarily unavailable [11]

Nó chỉ ra rằng máy chủ không trả lại dữ liệu trong thời gian được chỉ định và kết nối đã hết thời gian chờ.

Request hết thời gian và buộc phải chấm dứt (Worker exit timeout, forced to terminate)

Nếu bạn gặp những điều sau:

WARNING swWorker_reactor_try_to_exit (ERRNO 9012): worker exit timeout, forced to terminate

Chỉ ra rằng quy trình công nhân đã không thoát trong thời gian đã thỏa thuận (max_wait_time seconds) và OpenSwoole buộc phải chấm dứt quy trình làm việc.

Bạn nên tăng thời gian chờ hoặc đảm bảo khối lượng công việc của bạn có thể giữ trong khoảng thời gian cấu hình max_wait_time. Tuy nhiên, đây chỉ có thể là sự cố khi tắt hoặc khởi động lại máy chủ.

Không thể gọi lại (Unable to find callback function for signal Broken pipe)

WARNING swSignalfd_onSignal (ERRNO 707): Unable to find callback function for signal Broken pipe: 13

Cho biết rằng dữ liệu được gửi đến một kết nối đã ngắt kết nối, thường là do giá trị trả về của lần gửi không được kiểm tra và việc trả lại không thành công và tiếp tục gửi.

Object của class Swoole\Curl\Handler không thể chuyển thành int

Khi sử dụng SWOOLE_HOOK_CURL, bạn có thể gặp các lỗi sau:

PHP Notice:  Object of class Swoole\Curl\Handler could not be converted to int

PHP Warning: curl_multi_add_handle() expects parameter 2 to be resource, object given

Khi CURL được gọi, nó không còn là kiểu tài nguyên nữa mà là kiểu đối tượng nên việc chuyển đổi thành int (Số) sẽ không được hỗ trợ.

Giải pháp tốt nhất để giải quyết vấn đề này là sử dụng SWOOLE_HOOK_NATIVE_CURL thay vì sử dụng CURL.

Bạn cũng có thể sử dụng SDK của Guzzle để thay thế trình xử lý.

Guzzle 7.0+ outputting result directly to console

Khi sử dụng đồng thời kết nối coroutines và Guzzle 7.0 +, sau khi bắt đầu yêu cầu, kết quả sẽ được xuất trực tiếp đến thiết bị đầu cuối.

Vui lòng cập nhật lên ít nhất v4.5.8 vì điều này đã được khắc phục.

No buffer space available

Lỗi này có thể được bỏ qua. Lỗi này là do tùy chọn socket_buffer_size quá lớn, không được các hệ thống chấp nhận và không ảnh hưởng đến hoạt động của chương trình.

Maximum GET request là 8192

Yêu cầu GET chỉ có một tiêu đề Http. OpenSwoole sử dụng bộ nhớ đệm kích thước cố định 8K và không thể sửa đổi. Nếu yêu cầu không phải là yêu cầu Http chính xác, sẽ xảy ra lỗi. Lỗi sau sẽ được đưa ra:

WARN swReactorThread_onReceive_http_request: http header is too long.

Kích thước file upload quá lớn (POST file upload size)

Kích thước tối đa bị giới hạn bởi package_max_length, mặc định là 2M, bạn có thể gọi Server-> set để chuyển vào một giá trị mới để sửa đổi kích thước. OpenSwoole chạy trong bộ nhớ, vì vậy nếu nó được đặt quá lớn, nó có thể gây ra một số lượng lớn các yêu cầu đồng thời làm cạn kiệt tài nguyên của máy chủ.

Có lẽ tốt nhất là bạn nên phân đoạn tải lên thay thế khi xử lý các tệp lớn đang được tải lên.

Kiểm tra cấu hình OpenSwoole đã cài đặt của bạn

OpenSwoole được cài đặt thông qua một phần mở rộng PHP PECL và yêu cầu bạn định cấu hình và biên dịch trước khi sử dụng OpenSwoole trong ứng dụng của mình.

Do phương pháp cài đặt bất kỳ tiện ích mở rộng PHP nào, bạn có thể muốn kiểm tra cách bạn đã định cấu hình OpenSwoole vào một ngày sau đó, để thực hiện việc này, bạn có thể sử dụng php –ri openswoole sẽ hiển thị các thông tin tương tự như:

openswoole

Open Swoole => enabled
Author => Open Swoole Group & Contributors <hello@swoole.co.uk>
Version => 4.7.3-dev
Built => Nov  7 2021 14:44:34
coroutine => enabled with boost asm context
kqueue => enabled
rwlock => enabled
sockets => enabled
openssl => OpenSSL 3.0.0 7 sep 2021
dtls => enabled
http2 => enabled
json => enabled
curl-native => enabled
pcre => enabled
c-ares => 1.17.2
zlib => 1.2.11
brotli => E16777225/D16777225
mysqlnd => enabled
async_redis => enabled

Directive => Local Value => Master Value
swoole.enable_coroutine => On => On
swoole.enable_library => On => On
swoole.enable_preemptive_scheduler => Off => Off
swoole.display_errors => On => On
swoole.use_shortname => On => On
swoole.unixsock_buffer_size => 262144 => 262144

Sau đó, nếu cần cấu hình lại OpenSwoole với các cài đặt khác, bạn có thể sử dụng ví dụ:

pecl install --configureoptions 'enable-sockets="no" enable-openssl="yes" enable-http2="yes" enable-mysqlnd="yes" enable-swoole-json="no" enable-swoole-curl="yes"' openswoole

Xem thêm về cách cài đặt tại đây.

PHP Fatal error: Uncaught Error: Call to undefined function Co\run()

Bạn có thể bật bí danh tên tắt OpenSwoole bằng cách sửa đổi php.ini hoặc openswoole.ini và thêm dòng sau:

swoole.use_shortname=On

ERROR Swoole short name have to disable

Bạn có thể tắt bí danh tên viết tắt của OpenSwoole bằng cách sửa đổi php.ini hoặc openswoole.ini và thêm dòng sau:

swoole.use_shortname=Off

 

Kết bài

Bài viết liên quan:

Giới thiệu về php swoole.
Cài đặt và cấu hình php swoole.

Hi vọng với bài viết này, bạn có thể giải quyết cá vấn lỗi cơ bản cho dự án của mình . Nếu bạn thấy bài viết hay và có ý nghĩa hãy like và chia sẻ bài viết này để mọi người cùng nhau học tập nhé. Cảm ơn các bạn đã ghé thăm codetutam.com

Exit mobile version