PHP 输出的各个时区对应的时差表

经常要查某些时区的时差,每次都写 PHP 脚本去输出毕竟不方便,索性直接批量输出,放在 Blog 上备份起来。

各个时区对应的时差表(不考虑夏时令):

Africa/Abidjan  +00:00
Africa/Accra    +00:00
Africa/Addis_Ababa      +03:00
Africa/Algiers  +01:00
Africa/Asmara   +03:00
Africa/Bamako   +00:00
Africa/Bangui   +01:00
Africa/Banjul   +00:00
Africa/Bissau   +00:00
Africa/Blantyre +02:00
Africa/Brazzaville      +01:00
Africa/Bujumbura        +02:00
Africa/Cairo    +02:00
Africa/Casablanca       +00:00
Africa/Ceuta    +01:00
Africa/Conakry  +00:00
Africa/Dakar    +00:00
Africa/Dar_es_Salaam    +03:00
Africa/Djibouti +03:00
Africa/Douala   +01:00
Africa/El_Aaiun +00:00
Africa/Freetown +00:00
Africa/Gaborone +02:00
Africa/Harare   +02:00
Africa/Johannesburg     +02:00
Africa/Kampala  +03:00
Africa/Khartoum +03:00
Africa/Kigali   +02:00
Africa/Kinshasa +01:00
Africa/Lagos    +01:00
Africa/Libreville       +01:00
Africa/Lome     +00:00
Africa/Luanda   +01:00
Africa/Lubumbashi       +02:00
Africa/Lusaka   +02:00
Africa/Malabo   +01:00
Africa/Maputo   +02:00
Africa/Maseru   +02:00
Africa/Mbabane  +02:00
Africa/Mogadishu        +03:00
Africa/Monrovia +00:00
Africa/Nairobi  +03:00
Africa/Ndjamena +01:00
Africa/Niamey   +01:00
Africa/Nouakchott       +00:00
Africa/Ouagadougou      +00:00
Africa/Porto-Novo       +01:00
Africa/Sao_Tome +00:00
Africa/Tripoli  +02:00
Africa/Tunis    +01:00
Africa/Windhoek +02:00
America/Adak    -10:00
America/Anchorage       -09:00
America/Anguilla        -04:00
America/Antigua -04:00
America/Araguaina       -03:00
America/Argentina/Buenos_Aires  -02:00
America/Argentina/Catamarca     -03:00
America/Argentina/Cordoba       -02:00
America/Argentina/Jujuy -03:00
America/Argentina/La_Rioja      -03:00
America/Argentina/Mendoza       -03:00
America/Argentina/Rio_Gallegos  -03:00
America/Argentina/Salta -03:00
America/Argentina/San_Juan      -03:00
America/Argentina/San_Luis      -03:00
America/Argentina/Tucuman       -02:00
America/Argentina/Ushuaia       -03:00
America/Aruba   -04:00
America/Asuncion        -03:00
America/Atikokan        -05:00
America/Bahia   -03:00
America/Barbados        -04:00
America/Belem   -03:00
America/Belize  -06:00
America/Blanc-Sablon    -04:00
America/Boa_Vista       -04:00
America/Bogota  -05:00
America/Boise   -07:00
America/Cambridge_Bay   -07:00
America/Campo_Grande    -03:00
America/Cancun  -06:00
America/Caracas -04:30
America/Cayenne -03:00
America/Cayman  -05:00
America/Chicago -06:00
America/Chihuahua       -07:00
America/Costa_Rica      -06:00
America/Cuiaba  -03:00
America/Curacao -04:00
America/Danmarkshavn    +00:00
America/Dawson  -08:00
America/Dawson_Creek    -07:00
America/Denver  -07:00
America/Detroit -05:00
America/Dominica        -04:00
America/Edmonton        -07:00
America/Eirunepe        -04:00
America/El_Salvador     -06:00
America/Fortaleza       -03:00
America/Glace_Bay       -04:00
America/Godthab -03:00
America/Goose_Bay       -04:00
America/Grand_Turk      -05:00
America/Grenada -04:00
America/Guadeloupe      -04:00
America/Guatemala       -06:00
America/Guayaquil       -05:00
America/Guyana  -04:00
America/Halifax -04:00
America/Havana  -05:00
America/Hermosillo      -07:00
America/Indiana/Indianapolis    -05:00
America/Indiana/Knox    -06:00
America/Indiana/Marengo -05:00
America/Indiana/Petersburg      -05:00
America/Indiana/Tell_City       -06:00
America/Indiana/Vevay   -05:00
America/Indiana/Vincennes       -05:00
America/Indiana/Winamac -05:00
America/Inuvik  -07:00
America/Iqaluit -05:00
America/Jamaica -05:00
America/Juneau  -09:00
America/Kentucky/Louisville     -05:00
America/Kentucky/Monticello     -05:00
America/La_Paz  -04:00
America/Lima    -05:00
America/Los_Angeles     -08:00
America/Maceio  -03:00
America/Managua -06:00
America/Manaus  -04:00
America/Marigot -04:00
America/Martinique      -04:00
America/Mazatlan        -07:00
America/Menominee       -06:00
America/Merida  -06:00
America/Mexico_City     -06:00
America/Miquelon        -03:00
America/Moncton -04:00
America/Monterrey       -06:00
America/Montevideo      -02:00
America/Montreal        -05:00
America/Montserrat      -04:00
America/Nassau  -05:00
America/New_York        -05:00
America/Nipigon -05:00
America/Nome    -09:00
America/Noronha -02:00
America/North_Dakota/Center     -06:00
America/North_Dakota/New_Salem  -06:00
America/Panama  -05:00
America/Pangnirtung     -05:00
America/Paramaribo      -03:00
America/Phoenix -07:00
America/Port-au-Prince  -05:00
America/Port_of_Spain   -04:00
America/Porto_Velho     -04:00
America/Puerto_Rico     -04:00
America/Rainy_River     -06:00
America/Rankin_Inlet    -06:00
America/Recife  -03:00
America/Regina  -06:00
America/Resolute        -05:00
America/Rio_Branco      -04:00
America/Santarem        -03:00
America/Santiago        -03:00
America/Santo_Domingo   -04:00
America/Sao_Paulo       -02:00
America/Scoresbysund    -01:00
America/Shiprock        -07:00
America/St_Barthelemy   -04:00
America/St_Johns        -03:30
America/St_Kitts        -04:00
America/St_Lucia        -04:00
America/St_Thomas       -04:00
America/St_Vincent      -04:00
America/Swift_Current   -06:00
America/Tegucigalpa     -06:00
America/Thule   -04:00
America/Thunder_Bay     -05:00
America/Tijuana -08:00
America/Toronto -05:00
America/Tortola -04:00
America/Vancouver       -08:00
America/Whitehorse      -08:00
America/Winnipeg        -06:00
America/Yakutat -09:00
America/Yellowknife     -07:00
Antarctica/Casey        +08:00
Antarctica/Davis        +07:00
Antarctica/DumontDUrville       +10:00
Antarctica/Mawson       +06:00
Antarctica/McMurdo      +13:00
Antarctica/Palmer       -03:00
Antarctica/Rothera      -03:00
Antarctica/South_Pole   +13:00
Antarctica/Syowa        +03:00
Antarctica/Vostok       +06:00
Arctic/Longyearbyen     +01:00
Asia/Aden       +03:00
Asia/Almaty     +06:00
Asia/Amman      +02:00
Asia/Anadyr     +12:00
Asia/Aqtau      +05:00
Asia/Aqtobe     +05:00
Asia/Ashgabat   +05:00
Asia/Baghdad    +03:00
Asia/Bahrain    +03:00
Asia/Baku       +04:00
Asia/Bangkok    +07:00
Asia/Beirut     +02:00
Asia/Bishkek    +06:00
Asia/Brunei     +08:00
Asia/Choibalsan +08:00
Asia/Chongqing  +08:00
Asia/Colombo    +05:30
Asia/Damascus   +02:00
Asia/Dhaka      +07:00
Asia/Dili       +09:00
Asia/Dubai      +04:00
Asia/Dushanbe   +05:00
Asia/Gaza       +02:00
Asia/Harbin     +08:00
Asia/Ho_Chi_Minh        +07:00
Asia/Hong_Kong  +08:00
Asia/Hovd       +07:00
Asia/Irkutsk    +08:00
Asia/Jakarta    +07:00
Asia/Jayapura   +09:00
Asia/Jerusalem  +02:00
Asia/Kabul      +04:30
Asia/Kamchatka  +12:00
Asia/Karachi    +05:00
Asia/Kashgar    +08:00
Asia/Kathmandu  +05:45
Asia/Kolkata    +05:30
Asia/Krasnoyarsk        +07:00
Asia/Kuala_Lumpur       +08:00
Asia/Kuching    +08:00
Asia/Kuwait     +03:00
Asia/Macau      +08:00
Asia/Magadan    +11:00
Asia/Makassar   +08:00
Asia/Manila     +08:00
Asia/Muscat     +04:00
Asia/Nicosia    +02:00
Asia/Novosibirsk        +06:00
Asia/Omsk       +06:00
Asia/Oral       +05:00
Asia/Phnom_Penh +07:00
Asia/Pontianak  +07:00
Asia/Pyongyang  +09:00
Asia/Qatar      +03:00
Asia/Qyzylorda  +06:00
Asia/Rangoon    +06:30
Asia/Riyadh     +03:00
Asia/Sakhalin   +10:00
Asia/Samarkand  +05:00
Asia/Seoul      +09:00
Asia/Shanghai   +08:00
Asia/Singapore  +08:00
Asia/Taipei     +08:00
Asia/Tashkent   +05:00
Asia/Tbilisi    +04:00
Asia/Tehran     +03:30
Asia/Thimphu    +06:00
Asia/Tokyo      +09:00
Asia/Ulaanbaatar        +08:00
Asia/Urumqi     +08:00
Asia/Vientiane  +07:00
Asia/Vladivostok        +10:00
Asia/Yakutsk    +09:00
Asia/Yekaterinburg      +05:00
Asia/Yerevan    +04:00
Atlantic/Azores -01:00
Atlantic/Bermuda        -04:00
Atlantic/Canary +00:00
Atlantic/Cape_Verde     -01:00
Atlantic/Faroe  +00:00
Atlantic/Madeira        +00:00
Atlantic/Reykjavik      +00:00
Atlantic/South_Georgia  -02:00
Atlantic/St_Helena      +00:00
Atlantic/Stanley        -03:00
Australia/Adelaide      +10:30
Australia/Brisbane      +10:00
Australia/Broken_Hill   +10:30
Australia/Currie        +11:00
Australia/Darwin        +09:30
Australia/Eucla +08:45
Australia/Hobart        +11:00
Australia/Lindeman      +10:00
Australia/Lord_Howe     +11:00
Australia/Melbourne     +11:00
Australia/Perth +08:00
Australia/Sydney        +11:00
Europe/Amsterdam        +01:00
Europe/Andorra  +01:00
Europe/Athens   +02:00
Europe/Belgrade +01:00
Europe/Berlin   +01:00
Europe/Bratislava       +01:00
Europe/Brussels +01:00
Europe/Bucharest        +02:00
Europe/Budapest +01:00
Europe/Chisinau +02:00
Europe/Copenhagen       +01:00
Europe/Dublin   +00:00
Europe/Gibraltar        +01:00
Europe/Guernsey +00:00
Europe/Helsinki +02:00
Europe/Isle_of_Man      +00:00
Europe/Istanbul +02:00
Europe/Jersey   +00:00
Europe/Kaliningrad      +02:00
Europe/Kiev     +02:00
Europe/Lisbon   +00:00
Europe/Ljubljana        +01:00
Europe/London   +00:00
Europe/Luxembourg       +01:00
Europe/Madrid   +01:00
Europe/Malta    +01:00
Europe/Mariehamn        +02:00
Europe/Minsk    +02:00
Europe/Monaco   +01:00
Europe/Moscow   +03:00
Europe/Oslo     +01:00
Europe/Paris    +01:00
Europe/Podgorica        +01:00
Europe/Prague   +01:00
Europe/Riga     +02:00
Europe/Rome     +01:00
Europe/Samara   +04:00
Europe/San_Marino       +01:00
Europe/Sarajevo +01:00
Europe/Simferopol       +02:00
Europe/Skopje   +01:00
Europe/Sofia    +02:00
Europe/Stockholm        +01:00
Europe/Tallinn  +02:00
Europe/Tirane   +01:00
Europe/Uzhgorod +02:00
Europe/Vaduz    +01:00
Europe/Vatican  +01:00
Europe/Vienna   +01:00
Europe/Vilnius  +02:00
Europe/Volgograd        +03:00
Europe/Warsaw   +01:00
Europe/Zagreb   +01:00
Europe/Zaporozhye       +02:00
Europe/Zurich   +01:00
Indian/Antananarivo     +03:00
Indian/Chagos   +06:00
Indian/Christmas        +07:00
Indian/Cocos    +06:30
Indian/Comoro   +03:00
Indian/Kerguelen        +05:00
Indian/Mahe     +04:00
Indian/Maldives +05:00
Indian/Mauritius        +05:00
Indian/Mayotte  +03:00
Indian/Reunion  +04:00
Pacific/Apia    -11:00
Pacific/Auckland        +13:00
Pacific/Chatham +13:45
Pacific/Easter  -05:00
Pacific/Efate   +11:00
Pacific/Enderbury       +13:00
Pacific/Fakaofo -10:00
Pacific/Fiji    +12:00
Pacific/Funafuti        +12:00
Pacific/Galapagos       -06:00
Pacific/Gambier -09:00
Pacific/Guadalcanal     +11:00
Pacific/Guam    +10:00
Pacific/Honolulu        -10:00
Pacific/Johnston        -10:00
Pacific/Kiritimati      +14:00
Pacific/Kosrae  +11:00
Pacific/Kwajalein       +12:00
Pacific/Majuro  +12:00
Pacific/Marquesas       -09:30
Pacific/Midway  -11:00
Pacific/Nauru   +12:00
Pacific/Niue    -11:00
Pacific/Norfolk +11:30
Pacific/Noumea  +11:00
Pacific/Pago_Pago       -11:00
Pacific/Palau   +09:00
Pacific/Pitcairn        -08:00
Pacific/Ponape  +11:00
Pacific/Port_Moresby    +10:00
Pacific/Rarotonga       -10:00
Pacific/Saipan  +10:00
Pacific/Tahiti  -10:00
Pacific/Tarawa  +12:00
Pacific/Tongatapu       +13:00
Pacific/Truk    +10:00
Pacific/Wake    +12:00
Pacific/Wallis  +12:00
UTC     +00:00

PHP 脚本:

<?php
$timezone_identifiers = DateTimeZone::listIdentifiers();
for ($i=0; $i < count($timezone_identifiers); $i++) {
        $timeZone = $timezone_identifiers[$i];
        $dateTimeZone = new DateTimeZone($timeZone);
        $dateTime = new DateTime('now', $dateTimeZone);
        $timeOffset = $dateTimeZone->getOffset($dateTime);
        $timeOffsetStr = output_offset($timeOffset);
        echo "$timeZone\t$timeOffsetStr\n";
}

function output_offset($offset) {
        $pre = $offset < 0 ? '-' : '+';
        if ($offset < 0) $offset = -$offset;
        $hour = (int)($offset / 3600);
        $minute = (int)($offset / 60) % 60;

        return $pre . sprintf('%02d:%02d', $hour, $minute);
}

— EOF —

善用 PHP-FPM 的 slow log 分析问题

节前公司站点出现了莫名的 502 错误,在服务器配置上拆腾未果,重新开始怀疑程序问题。

关于 502 错误,具体可以参考以下两篇文章:
《自动检测 PHP-FPM 的错误并重启的 PHP 脚本》
《NGINX + PHP-FPM 502 相关事》

根据错误提示(11: Resource temporarily unavailable) ,排除掉服务器配置的问题,自然而然就怀疑是资源被程序占用光了。

这些资源包括数据库连接、文件数、锁等等,如果一个个去猜解调试甚至是走读代码,未免太费时间,也未必能发现问题所在。

好在 PHP-FPM 提供了慢执行日志,可以将执行比较慢的脚本的调用过程 dump 到日志中。

配置比较简单,PHP 5.3.3 之前设置如下:

The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
'0s' means 'off'
<value name="request_slowlog_timeout">1s</value>

The log file for slow requests
<value name="slowlog">logs/slow.logs</value>

PHP 5.3.3 之后设置以下如下:

; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_slowlog_timeout = 1s

; The log file for slow requests
; Default Value: /usr/local/php/log/php-fpm.log.slow
slowlog = /usr/local/php/log/php-fpm.log.slow

还可以将执行时间太长的进程直接终止,设置下执行超时时间即可。
PHP 5.3.3 之前版本:

The timeout (in seconds) for serving a single request after which the worker process will be terminated
Should be used when 'max_execution_time' ini option does not stop script execution for some reason
'0s' means 'off'
<value name="request_terminate_timeout">10s</value>

PHP 5.3.3+:

; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_terminate_timeout = 10s

加上慢执行日志后,我们可以很容易从慢执行日志中看出问题所在,比如:

Feb 07 19:00:30.378095 pid 27012 (pool default)
script_filename = /www/adshow/a.php
[0x000000000115ea08] flock() /www/backend/parser/logs.class.php:260
[0x0000000001159810] lock_stats() /www/adshow/a.php:126

Feb 07 19:00:31.033073 pid 27043 (pool default)
script_filename = /www/adshow/a.php
[0x00000000012686e8] flock() /www/backend/parser/logs.class.php:260
[0x00000000012634f0] lock_stats() /www/adshow/a.php:126

Feb 07 19:00:31.163995 pid 26979 (pool default)
script_filename = /www/adshow/a.php
[0x000000000115bda8] flock() /www/backend/parser/logs.class.php:260
[0x0000000001156bb0] lock_stats() /www/adshow/a.php:126

Feb 07 19:00:31.164102 pid 27033 (pool default)
script_filename = /www/adshow/a.php
[0x00000000013f3fa8] flock() /www/backend/parser/logs.class.php:260
[0x00000000013eedb0] lock_stats() /www/adshow/a.php:126

Feb 07 19:00:31.297313 pid 27448 (pool default)
script_filename = /www/adshow/a.php
[0x0000000001180218] flock() /www/backend/parser/logs.class.php:260
[0x000000000117b020] lock_stats() /www/adshow/a.php:126

很明显是程序中产生了死锁,导致各个 PHP-CGI 进程互相等待资源而锁死。
据此,再进行进一步的程序分析,就更具方向性了。

— EOF —

NGINX + PHP-FPM 502 相关事

NGINX + PHP-FPM 报 502 错误,我想大部分 SA 都遇到过吧。
根据报错的频率,可以分为两种情况,间歇性的502和连续性的502。
这里只讨论第一种情况——间歇性的502。

502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的。

在 PHP-FPM 的配置中存在这么一项:

How much requests each process should execute before respawn.
Useful to work around memory leaks in 3rd party libraries.
For endless request processing please specify 0
Equivalent to PHP_FCGI_MAX_REQUESTS
<value name=”max_requests”>500</value>

这段配置的意思是,当一个 PHP-CGI 进程处理的请求数累积到 500 个后,自动重启该进程。

但是为什么要重启进程呢?

一般在项目中,我们多多少少都会用到一些 PHP 的第三方库,这些第三方库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。

正是因为这个机制,在高并发的站点中,经常导致 502 错误,我猜测原因是 PHP-FPM 对从 NGINX 过来的请求队列没处理好。不过我目前用的还是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否还存在这个问题。

目前我们的解决方法是,把这个值尽量设置大些,尽可能减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。在我们自己实际的生产环境中发现,内存泄漏并不明显,因此我们将这个值设置得非常大(204800)。大家要根据自己的实际情况设置这个值,不能盲目地加大。

话说回来,这套机制目的只为保证 PHP-CGI 不过分地占用内存,为何不通过检测内存的方式来处理呢?我非常认同高春辉所说的,通过设置进程的峰值内在占用量来重启 PHP-CGI 进程,会是更好的一个解决方案。

期待他的建议能在今后的 PHP-FPM 版本中实现。

— EOF —

自动检测 PHP-FPM 的错误并重启的 PHP 脚本

公司的 WEB 生产服务器使用 NGINX+PHP-FPM 构建。

近日 NGINX 频报 (110: Connection timed out) 以及 (11: Resource temporarily unavailable) 的错误,出错后后端的 PHP-FPM 几乎全部挂死,重启 PHP-FPM 后又能正常工作。

初步认定是 PHP-FPM 或系统参数配置有问题,优化了系统参数并重启服务器后,目前尚未发现问题。

但是依然比较担心意外情况发生,没人想在春节期间再来照看这些服务器,索性用 PHP 写了个脚本监控错误日志,监测到错误后自动重启 PHP-FPM。

脚本下载:
phpfpm_guarder

配置说明:
$bin_tail_path tail命令路径
$bin_cp_path cp命令路径
$log_path 错误日志文件路径
$error_logs 要检测的错误类型,可以检测多种
$restart_cmd 重启 PHP-FPM 的命令
$guide_period 检测周期,单位为秒
$max_error_cnt 在检测周期里面发现多少次错误后重启服务器

没几天就要过年了,祝各位新快乐,万事如意!

— EOF —

关于持久连接和 FastCGI

PHP 作为一种脚本解释语言,其解析器在执行完脚本后会释放所有资源,包括数据库连接等等。这样下次需要再执行脚本时,就需要重新连接数据库了。
频繁地创建和关闭连接,无疑会造成不必要的开销。因此,在 PHP 中引入了持久连接的概念。具体可以看:
http://php.net/manual/en/features.persistent-connections.php

持久连接,不能工作在 CGI 模式下,因为 CGI 进程结束后,会释放所有资源。
PHP 当前主流的运行模式有两种,一种是以 web server 的 module 运行,另一种是 fastcgi。
在这两种模式下,都能够使用持久连接,因为创建连接后连接资源可以交给 web server 或 fastcgi server。

我个人更偏向于用 fastcgi,结构清晰,并且能提升 web server 的处理性能。
来看看一段简短地描述:

After all, Apache already has mod_php.
However, there are advantages to running PHP with FastCGI. Separating the PHP code from the web server removes ‘bloat’ from the main server, and should improve the performance of non-PHP requests. Secondly, having one permanent PHP process as opposed to one per apache process means that shared resources like persistent database connections are used more efficiently.

在 fastcgi 模式下,一个 PHP 进程固定地占用一个持久连接,只有可能连接数据库的 PHP 脚本才有可能装入这个 PHP 进程。
而 module 模式下,每个 apache 进程都会加载 PHP 模块,每个 apache 进程都会占用一个持久连接,这样不管是不是在处理 PHP ,都要占用连接。
因此,fastcgi 比 module 能够更好地利用持久连接。

在使用持久连接时,需要特别注意的是,数据库设置的允许的最大连接数不能小于 PHP 可能的实例数。

  • 在 module 模式下,数据库连接数要大于 apache 可能的最大进程数。
  • 在 fastcgi 模式下,数据库连接数要大于 php-cgi 最大进程数。

否则,可能出现连接数不够无法连接到数据库的错误。

来做个应用题:
一个网站的 PHP 运行在 fastcgi 模式下,流量大概是 1亿/日,需要持久连接的资源有 3 种。请估算下要几个 php-cgi 实例,几个持久连接?

1亿/日,估算高峰期每秒请求数为日均压力的 10 倍,为 (1亿/86400)*10 = 11574 requests/second。
假设每个请求平均耗时 0.3 秒,那么至少需要运行 11574/3 = 3858 个 php-cgi 实例。
采用持久连接,每个资源需要 1 个连接,需要 3858*3 = 11574 个持久连接。

挺险的,如果用 tcp 连接,数量级再大一倍,连接数都不够用了(当然我们还可以用 Unix Domain Socket),不过这种量也不可能跑在单台服务器上,所以连接数的问题也不愁啦。

— EOF —