{
  "version": "https://jsonfeed.org/version/1", 
  "title": "PHP", 
  "description": "PHP \u662f\u4e00\u95e8\u88ab\u5e7f\u6cdb\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u5c24\u5176\u662f\u5728\u5404\u7c7b\u4e92\u8054\u7f51\u7ad9\u9879\u76ee\u4e2d\u3002PHP \u4ee3\u7801\u53ef\u4ee5\u88ab\u5f88\u5bb9\u6613\u5730\u5d4c\u5165\u5230 HTML \u4e2d\u3002", 
  "home_page_url": "https://www.v2ex.com/go/php", 
  "feed_url": "https://www.v2ex.com/feed/php.json", 
  "icon": "https://cdn.v2ex.com/navatar/44f6/83a8/62_large.png?m=1644475743", 
  "favicon": "https://cdn.v2ex.com/navatar/44f6/83a8/62_normal.png?m=1644475743", 
  "items": [
    {
      "author": {
        "url": "https://www.v2ex.com/member/tmf4ck", 
        "name": "tmf4ck", 
        "avatar": "https://cdn.v2ex.com/avatar/d63a/fcd8/364596_large.png?m=1550216095"
      }, 
      "url": "https://www.v2ex.com/t/1203375", 
      "title": "\u6709\u6ca1\u6709\u4ec0\u4e48\u597d\u7528\u7684\u514d\u8d39\u5f00\u6e90 CRM \u7cfb\u7edf", 
      "id": "https://www.v2ex.com/t/1203375", 
      "date_published": "2026-04-03T08:53:26+00:00", 
      "content_html": "<p>RT \uff0c\u6240\u91cc\u6848\u5b50\u8d8a\u6765\u8d8a\u591a\u4e0d\u597d\u6574\u7406\uff0c\u5e72\u8106\u5f04\u4e2a\u7cfb\u7edf\u5f55\u8fdb\u53bb\uff0c\u6700\u597d\u662f PHP \u5199\u7684\u56e0\u4e3a\u53ea\u4f1a\u4e00\u70b9\u8fd9\u4e2a\u5176\u4ed6\u7684\u4e0d\u4f1a</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lanhiy", 
        "name": "lanhiy", 
        "avatar": "https://cdn.v2ex.com/avatar/9d53/fc82/108674_large.png?m=1761704232"
      }, 
      "url": "https://www.v2ex.com/t/1196334", 
      "title": "2026 \u5e74 PHP \u8def\u5728\u4f55\u65b9", 
      "id": "https://www.v2ex.com/t/1196334", 
      "date_published": "2026-03-06T07:07:55+00:00", 
      "content_html": ""
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Rust2015", 
        "name": "Rust2015", 
        "avatar": "https://cdn.v2ex.com/avatar/51fd/c72d/674984_large.png?m=1738501691"
      }, 
      "url": "https://www.v2ex.com/t/1191055", 
      "title": "2026 \u5e74\uff0c\u5b66 laravel \u6709\u6ca1\u6709\u524d\u9014\uff1a", 
      "id": "https://www.v2ex.com/t/1191055", 
      "date_published": "2026-02-05T14:06:43+00:00", 
      "content_html": "<p>\u5982\u9898\uff0c\u4f1a\u4e0d\u4f1a</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/sxszzhrrt", 
        "name": "sxszzhrrt", 
        "avatar": "https://cdn.v2ex.com/gravatar/23b764920ac763862cdf62a69d6e94cd?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1188137", 
      "date_modified": "2026-01-25T04:48:00+00:00", 
      "content_html": "RT \uff0c\u6c42\u63a8\u8350\u4e00\u4e2a PHP \u6846\u67b6\uff0c\u6839\u76ee\u5f55\u76f4\u63a5\u5c31\u662f index.php \uff0c\u4e0d\u50cf Laravel/ThinkPHP \u90a3\u6837\u7684\u8fd8\u8981\u6307\u5b9a web/\u76ee\u5f55\u6765\u8fd0\u884c\u3002\u6743\u9650\u4ec0\u4e48\u7684\u90fd\u662f\u901a\u8fc7\u4ee3\u7801\u6216\u8005\u64cd\u4f5c\u7cfb\u7edf\u7684\u6743\u9650\u6765\u63a7\u5236\u3002<br />\u60f3\u77e5\u9053\u6709\u8fd9\u6837\u7684 PHP \u6846\u67b6\u5417\uff1f\u6211\u89c9\u5f97\u8fd9\u79cd\u5bf9\u4e8e\u51e0\u5757\u94b1\u7684\u865a\u62df\u4e3b\u673a\u7279\u522b\u53cb\u597d\uff08\u5176\u4e2d\u597d\u591a\u90fd\u4e0d\u652f\u6301\u7ed1\u5b9a\u5b50\u76ee\u5f55\u7684\uff09\uff0c\u7b80\u5355\u4e14\u8db3\u591f\u8f7b\u91cf\u5316\u3002", 
      "date_published": "2026-01-25T02:06:40+00:00", 
      "title": "\u6709\u6ca1\u6709\u8fd9\u6837\u7684 PHP \u6846\u67b6", 
      "id": "https://www.v2ex.com/t/1188137"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Loser110", 
        "name": "Loser110", 
        "avatar": "https://cdn.v2ex.com/avatar/4560/7188/552270_large.png?m=1769519292"
      }, 
      "url": "https://www.v2ex.com/t/1185421", 
      "date_modified": "2026-01-15T05:28:57+00:00", 
      "content_html": "PHP \u7528\u4e86\u5341\u5e74\u4e86\uff0c\u4e5f\u505c\u6ede\u5728\u67d0\u4e2a\u7248\u672c\u5f88\u591a\u5e74\u4e86\u3002<br /><br />\u6700\u8fd1\u9879\u76ee\u91cd\u6784\uff0c\u7528\u65b0\u7684\u5e93\uff0c\u4e00\u5f00\u59cb\u7528 laravel \uff0c\u4e5d\u725b\u4e8c\u864e\u641e\u8d77\u6765\uff0c\u611f\u89c9\u597d\u590d\u6742\uff0c\u8fd8\u6162\uff0c\u5c31\u641e\u4e86 flightphp \uff0c\u5feb\u5341\u500d\uff0c\u4e5f\u7b80\u5355\u3002\u4f46\u662f\uff0c\u73b0\u5728\u53c8\u53d1\u73b0 go \uff0cflightphp \u662f\u730e\u8c79\uff0cgo \u5c31\u662f\u706b\u7bad\u554a\u3002\u4f5c\u4e3a web api \uff0c\u4e5f\u5c31\u57fa\u672c crud \u5de5\u4f5c\uff0cgo \u5e94\u8be5\u80fd\u5f88\u597d\u7684\u5b8c\u6210\u3002\u6570\u636e\u5e93\uff0cai \u65f6\u4ee3\uff0c\u5b8c\u5168\u53ef\u4ee5\u7528\u539f\u751f SQL \u4e86\u3002<br /><br />\u8fd9\u6b21\u5982\u679c\u91cd\u6784\u5b8c\u6210\uff0c\u90a3\u5c31\u8981\u548c PHP \u62dc\u62dc\u4e86\uff0c\u56e0\u4e3a WEBAPI \u5982\u679c\u7528 GO \uff0c\u5c31\u6ca1\u6709\u5730\u65b9\u7528\u4ed6\u4e86\uff0c\u6d4b\u8bd5\u7528 PYTHON \u5927\u6570\u636e\u7528 PYTHON EXCEL \u7528 PYTHON \uff0c\u524d\u7aef\u7528 SVELTEKIT \uff0c\u5176\u4ed6\u7528 GO<br /><br />\u8fd9\u6837\u5b50\u770b\uff0cPHP \u662f\u4e0d\u662f\u5feb\u6b7b\u4e86\uff1f\u5fae\u670d\u52a1\uff0b AI \u65f6\u4ee3\uff0c\u4ed6\u6ca1\u6709\u64c5\u957f\u7684\u6280\u80fd\uff0c\u5404\u4e2a\u6a21\u5757\u90fd\u88ab\u5176\u4ed6\u8bed\u8a00\u4ee3\u66ff\uff1f", 
      "date_published": "2026-01-14T00:59:09+00:00", 
      "title": "PHP \u662f\u4e0d\u662f\u5feb\u6b7b\u4e86", 
      "id": "https://www.v2ex.com/t/1185421"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/baiyekaslana", 
        "name": "baiyekaslana", 
        "avatar": "https://cdn.v2ex.com/avatar/7b23/e490/617120_large.png?m=1709536270"
      }, 
      "url": "https://www.v2ex.com/t/1184787", 
      "date_modified": "2026-01-12T02:46:45+00:00", 
      "content_html": "<p>\u4f7f\u7528\u7684\u6d4b\u8bd5\u6587\u4ef6 info.php,\u8c03\u7528 <a href=\"http://php.info\" rel=\"nofollow\">php.info</a>();\n\u73b0\u5728\u7f51\u7ad9\u9700\u8981\u653e\u5728\u5176\u4ed6\u8def\u5f84\u5e95\u4e0b\uff0c\u4fee\u6539\u4e86 nginx \u4e2d\u7684 root \u4e4b\u540e\u5c31\u63d0\u793a No input file specified.\n\u4f46\u662f index.html \u9759\u6001\u6587\u4ef6\u663e\u793a\u6b63\u5e38</p>\n<h2>\u5728\u7f51\u4e0a\u67e5\u7684\u548c gpt \u95ee\uff0c\u8bd5\u8fc7\u4ee5\u4e0b\u51e0\u79cd\u65b9\u5f0f\u8fd8\u662f\u4e0d\u884c\uff0c\u6c42\u5927\u4f6c\u5e2e\u5fd9\u770b\u4e0b</h2>\n<h2>1 \uff0cphp74/etc/php-fpm.d/www.conf \u6587\u4ef6\u4e2d chroot \u548c chdir \u53c2\u6570\u90fd\u662f\u9ed8\u8ba4\u6ce8\u91ca\u7684\uff0c\n\u5728 info.php \u4e2d\uff0c\u53c2\u6570\u663e\u793a\u5982\u4e0b\nUSER\twww-data\nHOME\t/var/www</h2>\n<h2>2 \uff0cnginx \u4e2d\u7684 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n$document_root \u6216\u8005\u4fee\u6539\u6210\u7edd\u5bf9\u8def\u5f84\u4e5f\u4e0d\u884c</h2>\n<h2>3 \uff0c\u4fee\u6539 cgi.fix_pathinfo=0</h2>\n<h2>4 \uff0c;cgi.force_redirect=1 \u53d6\u6d88\u6ce8\u91ca</h2>\n<p>\u4e0a\u8ff0\u7684 4 \u79cd\u65b9\u5f0f\u6700\u591a\u5c31\u662f\u67d0 2 \u4e2a\u4e00\u8d77\u8bd5\u8fc7\u3002\n\u5173\u4e8e\u6587\u4ef6\u6743\u9650\u95ee\u9898\uff0c/var/www \u4f7f\u7528\u7684\u662f 777 \uff0chtml \u548c\u6211\u60f3\u653e\u7684\u6587\u4ef6\u5939 site \u7684\u6743\u9650\u4e5f\u662f 777 \uff0csite \u548c\u7f51\u7ad9\u6587\u4ef6\u7684\u5c5e\u7ec4\u548c\u5c5e\u4e3b\u90fd\u662f www-data\nphp74/etc/php-fpm.d/www.conf \u6587\u4ef6\u4e2d</p>\n<hr/>\n<p>user = www-data</p>\n<p>group = www-data</p>\n<p>listen = /run/php74-fpm.sock</p>\n<p>listen.owner = www-data</p>\n<p>listen.group = www-data</p>\n<p>listen.mode = 0660</p>\n<hr/>\n<p>/run/php74-fpm.sock \u7684\u5c5e\u7ec4\u548c\u5c5e\u4e3b\u662f www-data</p>\n<p>\u6c42\u5927\u4f6c\u5e2e\u5fd9\u770b\u4e0b\u8fd8\u6709\u4ec0\u4e48\u529e\u6cd5\u561b\uff0c\u60f3\u653e\u5230/var/www/site \u6587\u4ef6\u5939\u4e0b</p>\n", 
      "date_published": "2026-01-12T02:41:41+00:00", 
      "title": "php74-fpm \u52a0 nginx, PHP \u6587\u4ef6\u53ea\u8981\u4e0d\u662f root /var/www/html \u5c31\u63d0\u793a No input file specified.\u6c42\u5927\u4f6c\u770b\u770b", 
      "id": "https://www.v2ex.com/t/1184787"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Loser110", 
        "name": "Loser110", 
        "avatar": "https://cdn.v2ex.com/avatar/4560/7188/552270_large.png?m=1769519292"
      }, 
      "url": "https://www.v2ex.com/t/1184524", 
      "title": "PHP framewok \u6846\u67b6\u63a8\u8350", 
      "id": "https://www.v2ex.com/t/1184524", 
      "date_published": "2026-01-10T14:22:43+00:00", 
      "content_html": "\u5206\u4eab\u4e00\u4e2a php \u6846\u67b6 flightphp \u3002<br /><br />3 \u4e2a\u5b57\u5f62\u5bb9\uff1a\u5feb\uff0c\u7b80\u5355\u3002<br /><br />\u76ee\u524d\u5728\u8003\u8651\u57fa\u4e8e AI \u4e0a\u9762\u7684\u6280\u672f\u8fed\u4ee3\uff0c\u9700\u8981\u91cd\u5199\u8001\u7cfb\u7edf\u3002\u539f\u6765\u5e94\u8be5\u5c31\u4e0d\u5347\u7ea7\u4e86\uff0c\u76f4\u63a5\u65b0\u6846\u67b6\u65b0\u670d\u52a1\u5668\uff0c\u4e00\u4e2a\u529f\u80fd\u4e00\u4e2a\u529f\u80fd\u7684\u8f6c\u79fb\u3002\u90fd\u8f6c\u79fb\u4e86\u8001\u5e93\u76f4\u63a5\u6254\u4e86\u5c31\u884c\u3002<br /><br />\u672c\u6765\u662f\u8003\u8651 laravel \u7684\uff0c\u68a6\u4e2d\u60c5\u6846\u554a\u3002\u53ef\u662f\uff0c\u5979\u771f\u7684\u6709\u70b9\u592a\u9b54\u6cd5\u4e86\uff0c\u611f\u89c9\u73b0\u5728\u8ddf bible \u4e00\u6837\u4e86\uff0c\u770b\u4e0d\u5b8c\u3002\u51fa\u73b0\u95ee\u9898\u4e5f\u4e0d\u597d\u89e3\u51b3\u3002\u6240\u4ee5\u5c31\u8f6c\u5ff5\u4e00\u60f3\uff0cAI Driven \u5f00\u53d1\uff0c \u8d8a\u7b80\u5355\u8d8a\u597d\u3002\u8981\u4e0d\u5f7b\u5e95\u6a21\u5757\u5316\uff0c\u5fae\u670d\u52a1\u5316\uff0c\u5c3d\u53ef\u80fd\u7684\u4e00\u4e2a\u4e1c\u897f\u53ea\u5e72\u4e00\u4ef6\u4e8b\uff0c\u53ea\u505a\u597d\u4e00\u4ef6\u4e8b\uff0c\u8d8a\u7b80\u5355\u8d8a\u597d\uff0c\u8fd9\u6837\u7684\u7528 AI \u6700\u65b9\u4fbf\u4e86\u3002\u6240\u4ee5\u5c31\u53d1\u73b0\u4e86 flightphp \u3002 \u771f\u592a\u7b80\u5355\u4e86\uff0c\u5c31\u4e00\u4e2a\u8def\u7531\uff0c\u51e0\u4e4e\u5176\u4ed6\u90fd\u6ca1\u4e86\uff0c\u5b8c\u7f8e\u9002\u5408 podman \u3002\u6ca1\u6709\u9b54\u6cd5\uff0c\u7b80\u5355\u6613\u61c2\uff0c\u4e00\u5207\u90fd\u662f\u6211\u81ea\u5df1\u5b8c\u5168\u638c\u63a7\u7684\u4ee3\u7801\uff0c\u539f\u6765\u7684\u5f88\u591a PHP \u4ee3\u7801\u90fd\u662f\u53ef\u4ee5\u7b80\u5355\u79fb\u690d\u8fc7\u6765\u3002<br /><br /><br />\u521d\u6b65\u7528 AI \u642d\u5efa\u4e86\u4e00\u4e2a hello world json \u9875\u9762\uff0c\u4e24\u4e2a\u90fd\u662f\u57fa\u4e8e podman+frakenphp+php8.5 \u3002<br />flightphp \u4e2a\u628a\u5c0f\u65f6\u642d\u5efa\u597d\uff0claravel \u7528\u4e86\u51e0\u5929\u3002<br /><br />\u521d\u6b65\u6d4b\u8bd5\u4e86\uff0cflightphp \u57fa\u672c\u6bd4 laravel \u5feb 10 \u500d\u4ee5\u4e0a\uff0cAI \u603b\u7ed3\u5177\u4f53\u5982\u4e0b\uff1a<br /><br /><br />ab -n 5000 -c 50 http://127.0.0.1:51011/up<br /><br />---<br /><br />51011 \u2014 /up endpoint<br /><br />Throughput: ~245 requests/sec<br /><br />Median latency: ~196 ms<br /><br />95th percentile: ~263 ms<br /><br />---<br /><br />51100 \u2014 / endpoint<br /><br />Throughput: ~3124 requests/sec<br /><br />Median latency: ~15 ms<br /><br />95th percentile: ~28 ms<br /><br />So 51100 is roughly:<br /><br />\u2248 12.7\u00d7 more throughput<br /><br />\u2248 13\u00d7 lower median latency<br /><br />\u2248 9\u201310\u00d7 lower tail latency (95th)"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/sunkangchina", 
        "name": "sunkangchina", 
        "avatar": "https://cdn.v2ex.com/gravatar/02bac72a6dd20f70ca9d1000a0121170?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1177644", 
      "date_modified": "2025-12-08T09:18:04+00:00", 
      "content_html": "<a target=\"_blank\" href=\"https://github.com/yii2cms/yii2cms\" rel=\"nofollow noopener\">https://github.com/yii2cms/yii2cms</a><br /><br />MIT \u534f\u8bae\uff0c\u6b22\u8fce\u4f7f\u7528\uff01", 
      "date_published": "2025-12-08T09:17:47+00:00", 
      "title": "\u57fa\u4e8e yii2 \u6846\u67b6\u5f00\u53d1\u7684\u540e\u53f0\u7ba1\u7406\u8f6f\u4ef6\uff0c\u514d\u8d39", 
      "id": "https://www.v2ex.com/t/1177644"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/mimiphp", 
        "name": "mimiphp", 
        "avatar": "https://cdn.v2ex.com/gravatar/c97c5e1b5a6392f107566fd8953d6bbb?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1177445", 
      "title": "\u300c\u4e00\u952e\u90e8\u7f72\u4f60\u7684\u4e13\u5c5e\u670d\u52a1\u5668\u300d\u2014\u2014WNMP \u4e00\u952e\u5305\uff0c\u8ba9 Web \u73af\u5883\u642d\u5efa\u56de\u5f52\u7b80\u5355", 
      "id": "https://www.v2ex.com/t/1177445", 
      "date_published": "2025-12-08T00:41:29+00:00", 
      "content_html": "<p>\u300c\u4e00\u952e\u90e8\u7f72\u4f60\u7684\u4e13\u5c5e\u670d\u52a1\u5668\u300d\u2014\u2014WNMP \u4e00\u952e\u5305\uff0c\u8ba9 Web \u73af\u5883\u642d\u5efa\u56de\u5f52\u7b80\u5355</p>\n<p>\u8fd8\u5728\u4e3a Nginx + PHP + \u6570\u636e\u5e93 \u7684\u590d\u6742\u5b89\u88c5\u800c\u5934\u75bc\u5417\uff1f\nWNMP \u4e00\u952e\u5305\uff0c\u8ba9\u8fd9\u4e00\u5207\u53d8\u6210\u2014\u2014\u4e00\u884c\u547d\u4ee4\u641e\u5b9a\u3002</p>\n<p>apt install -y curl &amp;&amp; curl -fL <a href=\"https://wnmp.org/zh/wnmp.sh\" rel=\"nofollow\">https://wnmp.org/zh/wnmp.sh</a> -o <a href=\"http://wnmp.sh\" rel=\"nofollow\">wnmp.sh</a> &amp;&amp; chmod +x <a href=\"http://wnmp.sh\" rel=\"nofollow\">wnmp.sh</a> &amp;&amp; bash <a href=\"http://wnmp.sh\" rel=\"nofollow\">wnmp.sh</a></p>\n<p>\u4e00\u5206\u949f\u5b89\u88c5\u5b8c\u6574 Web \u73af\u5883\uff1a</p>\n<ul>\n<li>Nginx 1.28.0 \uff08\u652f\u6301 HTTP/2 \u3001WebDAV \u3001Stream \uff09</li>\n<li>PHP 8.2\u20138.5</li>\n<li>MariaDB 10.6 / 10.11 \uff08\u5185\u7f6e Mroonga \u5168\u6587\u641c\u7d22\u5f15\u64ce\uff09</li>\n<li>\u81ea\u52a8 SSL \u8bc1\u4e66\uff08 <a href=\"http://acme.sh\" rel=\"nofollow\">acme.sh</a> \uff09</li>\n<li>WebDAV \u4e91\u76d8\u652f\u6301\uff08\u62d2\u7edd\u660e\u6587 FTP \uff09</li>\n</ul>\n<p>\u7cfb\u7edf\u81ea\u52a8\u4f18\u5316\uff1a</p>\n<ul>\n<li>\u542f\u7528 BBR/FQ \u7f51\u7edc\u52a0\u901f</li>\n<li>\u5173\u95ed THP \uff0c\u4f18\u5316\u5185\u6838\u53c2\u6570</li>\n<li>\u5168\u9762\u9002\u914d Debian 12/13 \u3001Ubuntu 22\u201325 \u3001WSL2</li>\n<li>\u81ea\u52a8\u751f\u6210\u5b89\u5168\u914d\u7f6e\uff0c\u9ed8\u8ba4\u9632\u6b62\u5e38\u89c1\u6f0f\u6d1e</li>\n</ul>\n<p>\u5b89\u5168\u4e3a\u5148 \u00b7 \u9ed8\u8ba4\u5373\u6700\u4f18\uff1a</p>\n<ul>\n<li>\u5185\u7f6e SSH \u5bc6\u94a5\u767b\u5f55</li>\n<li>PHP \u9ed8\u8ba4\u5173\u95ed\u5371\u9669\u51fd\u6570</li>\n<li>phpMyAdmin \u542f\u7528 BasicAuth \u53cc\u91cd\u9632\u62a4</li>\n<li>SSL \u8bc1\u4e66\u5168\u81ea\u52a8\u7b7e\u53d1\u4e0e\u7eed\u671f</li>\n</ul>\n<p>\u9762\u5411\u5f00\u53d1\u8005\u4e0e\u7ad9\u957f\u7684\u771f\u6b63\u201c\u96f6\u963b\u529b\u201d\u65b9\u6848\uff1a\n\u65e0\u8bba\u4f60\u662f\u72ec\u7acb\u5f00\u53d1\u8005\u3001\u4e91\u670d\u52a1\u5546\u3001\u8fd8\u662f\u8fb9\u7f18\u8282\u70b9\u8fd0\u7ef4\u8005\uff0cWNMP \u8ba9\u670d\u52a1\u5668\u73af\u5883\u90e8\u7f72\u53d8\u5f97\u548c\u5b89\u88c5\u6d4f\u89c8\u5668\u4e00\u6837\u7b80\u5355\u3002\n\u8f7b\u91cf\u3001\u7a33\u5b9a\u3001\u53ef\u590d\u5236 \u2014\u2014 \u4e00\u6b21\u914d\u7f6e\uff0c\u6c38\u4e45\u53d7\u76ca\u3002</p>\n<p>\u5b98\u65b9\u7f51\u7ad9\uff1a <a href=\"https://wnmp.org\" rel=\"nofollow\">https://wnmp.org</a>\n\u793e\u533a\u652f\u6301\uff1aQQ \u7fa4 1075305476 \uff5c Telegram @wnmps\nGithub\uff1a[url]<a href=\"https://github.com/lowphpcom/wnmp\" rel=\"nofollow\">https://github.com/lowphpcom/wnmp</a>[/url]\n\u5f00\u6e90\u534f\u8bae\uff1aGPLv3</p>\n<p>WNMP \u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u811a\u672c\uff0c\u5b83\u662f\u4e0b\u4e00\u4ee3 PHP \u8fd0\u884c\u73af\u5883\u751f\u6001\u7684\u8d77\u70b9 \u2014\u2014\n\u57fa\u4e8e LOWPHP \u7684\u5e38\u9a7b\u5185\u5b58\u67b6\u6784\uff0c\u672a\u6765\u5c06\u5e26\u6765\u539f\u751f\u7ea7\u7684\u9ad8\u6027\u80fd PHP \u4f53\u9a8c\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/florentino", 
        "name": "florentino", 
        "avatar": "https://cdn.v2ex.com/avatar/9c43/a52b/520162_large.png?m=1765959852"
      }, 
      "url": "https://www.v2ex.com/t/1177111", 
      "date_modified": "2025-12-05T08:01:19+00:00", 
      "content_html": "<p>temporal \u5b98\u7f51\u793a\u4f8b</p>\n<p>python:</p>\n<pre><code>@workflow.defn\nclass SleepForDaysWorkflow:\n    # Send an email every 30 days, for the year\n    @workflow.run\n    async def run(self) -&gt; None:\n        for i in range(12):\n            # Activities have built-in support for timeouts and retries!\n            await workflow.execute_activity(\n                send_email,\n                start_to_close_timeout=timedelta(seconds=10),\n            )\n\n            # Sleep for 30 days (yes, really)!\n            await workflow.sleep(timedelta(days=30))\n</code></pre>\n<p>ruby: </p>\n<pre><code>\n# Send an email every 30 days, for the year\nclass SleepForDaysWorkflow &lt; Temporalio::Workflow::Definition\n  def execute\n    12.times do\n      # Activities have built-in support for timeouts and retries!\n      Temporalio::Workflow.execute_activity(\n        SendEmailActivity,\n        start_to_close_timeout: 10\n      )\n\n      # Sleep for 30 days (yes, really)!\n      Temporalio::Workflow.sleep(30 * 24 * 60 * 60)\n    end\n  end\nend\n</code></pre>\n<p>C#:</p>\n<pre><code>[Workflow]\npublic class SleepForDaysWorkflow\n{\n    // Send an email every 30 days, for the year\n    [WorkflowRun]\n    public async Task RunAsync()\n    {\n        for (int i = 0; i &lt; 12; i++)\n        {\n            // Activities have built-in support for timeouts and retries!\n            await Workflow.ExecuteActivityAsync(\n                (Activities act) =&gt; act.SendEmail(),\n                new() { StartToCloseTimeout = TimeSpan.FromSeconds(10) });\n\n            // Sleep for 30 days (yes, really)!\n            await Workflow.DelayAsync(TimeSpan.FromDays(30));\n        }\n    }\n}\n</code></pre>\n<p>PHP:</p>\n<pre><code>class SleepForDaysWorkflow implements SleepForDaysWorkflowInterface\n{\n  // Send an email every 30 days.\n  public function sleepForDays(): void\n  {\n      for ($i = 0; $i &lt; 12; $i++) {\n          // Activities have timeouts, and will be retried by default!\n          $this-&gt;sendEmailActivity-&gt;sendEmail();\n\n          // Sleep for 30 days (yes, really)!\n          Workflow::sleep(30 * 24 * 60 * 60)\n      }\n  }\n}\n</code></pre>\n<p>\u611f\u89c9\u5bf9\u4e8e  java \u7a0b\u5e8f\u5458 php \u7684\u5fc3\u667a\u8d1f\u62c5\u597d\u5c0f\u554a</p>\n", 
      "date_published": "2025-12-05T05:56:07+00:00", 
      "title": "\u5b8c\u86cb\u4e86,\u4e3a\u4ec0\u4e48\u6211\u611f\u89c9 PHP \u7684\u8bed\u6cd5\u8fd9\u4e48\u4f18\u96c5\u5462", 
      "id": "https://www.v2ex.com/t/1177111"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/cj323", 
        "name": "cj323", 
        "avatar": "https://cdn.v2ex.com/gravatar/55d8713a4741083ba73747a518298a1f?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1174079", 
      "title": "\u672a\u6765\u5c5e\u4e8e PHP", 
      "id": "https://www.v2ex.com/t/1174079", 
      "date_published": "2025-11-20T15:25:25+00:00", 
      "content_html": "\u662f\u7684\uff0cPHP \u62e5\u6709\u5149\u660e\u7684\u672a\u6765\u3002\u5404\u4f4d\u770b\u5b98\u53ef\u80fd\u4f1a\u89c9\u5f97\u8fd9\u662f\u73a9\u7b11\uff0c\u4f46\u60a8\u522b\u6025\uff0c\u4e14\u542c\u6211\u626f\u51e0\u53e5\u3002\u8fd9\u4e0d\u662f\u6807\u9898\u515a\uff0c\u4e5f\u4e0d\u662f\u54d7\u4f17\u53d6\u5ba0\u3002\u8fd9\u662f\u697c\u4e3b\u8fd1\u51e0\u5929\u5b9e\u5b9e\u5728\u5728\u7684\u6709\u611f\u800c\u53d1\u3002<br /><br />\u8fd9\u4e00\u5207\u6e90\u4e8e\u6700\u8fd1\u6211\u5bb6\u5c0f\u670b\u53cb\u6709\u4e86\u7f16\u7a0b\u7684\u5174\u8da3\uff1b\u5728\u5c1d\u8bd5\u5b66\u7b2c\u4e00\u95e8\u7f16\u7a0b\u8bed\u8a00\u3002\u8ba9\u6211\u610f\u60f3\u4e0d\u5230\u7684\u662f\uff0c\u4ed6\u9009\u62e9\u4e86 PHP \u3002\u6211\u5f88\u60ca\u8bb6\uff0cPHP \u4e0d\u662f\u6ca1\u843d\u4e86\u5417\uff1f\u5927\u5bb6\u8ba8\u8bba\u7684\u90fd\u662f JS \uff0cGo \uff0cRust \uff0cPython \u7b49\u7b49\u70ed\u95e8\u8bed\u8a00\uff0c\u6309\u7406\u8bf4\u5c0f\u5b69\u7f51\u4e0a\u600e\u4e48\u641c\u4e5f\u4e0d\u4f1a\u8e66\u51fa PHP \u8fd9\u4e09\u4e2a\u5b57\u6bcd\u5427\u3002\u4ee4\u6211\u66f4\u610f\u60f3\u4e0d\u5230\u7684\u662f\uff0c\u4ed6\u5b66\u5f97\u6d25\u6d25\u6709\u5473\u3002\u800c\u4e14\u5df2\u7ecf\u6709\u4e86\u4e00\u4e9b\u6210\u679c\u3002\u89c2\u5bdf\u51e0\u5929\u540e\uff0c\u6211\u624d\u53d1\u73b0\uff0c\u8fd9\u4e00\u5207\u5e76\u975e\u5076\u7136\u3002<br /><br />\u6700\u91cd\u8981\u4e00\u70b9\u56e0\u7d20\uff0c\u662f PHP \u6709\u6700\u53cb\u597d\u7684\u793e\u533a\uff0c\u6ca1\u6709\u4e4b\u4e00\u3002\u4e0d\u7ba1\u662f\u5185\u5916\u7f51\uff0cPHP \u793e\u533a\u6709\u6781\u9ad8\u7684\u5305\u5bb9\u5ea6\u3002PHP \u7684\u8ba8\u8bba\u533a\u5f88\u5c11\u6709\u65e0\u8c13\u7684\u4e89\u5435\uff0c\u865a\u8363\u7684\u63a8\u9500\u3002\u76f8\u53cd\uff0cPHP \u793e\u533a\u6709\u5f88\u591a\u5728\u5176\u4ed6\u5708\u5b50\u5c11\u89c1\u7684\u8c26\u900a\u4e0e\u8010\u5fc3 \u2014 \u8fd9\u4e5f\u662f\u6211\u5c0f\u5b69\u559c\u6b22\u7f51\u4e0a\u8ba8\u8bba PHP \u7684\u5173\u952e\u56e0\u7d20\uff1a\u5f53\u5176\u4ed6\u793e\u533a\u56e0\u4e3a\u4e00\u4e2a\u8bed\u6cd5\u7cd6\uff0c\u4e00\u4e2a\u6846\u67b6\uff0c\u4e00\u4e2a\u5305\u4e89\u5f97\u9762\u7ea2\u8033\u8d64\u65f6\uff0c\u7ecf\u9a8c\u4e30\u5bcc\u7684 PHP \u7a0b\u5e8f\u5458\u5374\u613f\u610f\u653e\u4e0b\u59ff\u6001\u53bb\u56de\u7b54\u51e0\u5c81\u5c0f\u5b69\u7684\u5165\u95e8\u95ee\u9898\u3002\u8fdb\u5165 Zig \uff0cRust \u7b49\u7b49\u793e\u533a\uff0c\u4f60\u4f1a\u770b\u5230\u5982\u90aa\u6559\u4e00\u822c\u7684\u4f20\u9053\u4e0e\u91cd\u5199\uff0c\u6211\u4e00\u4e2a\u5927\u4eba\u90fd\u6709\u70b9\u627f\u53d7\u4e0d\u4f4f\u3002\u4e3a\u4e86\u5c0f\u5b69\u7684\u8eab\u5fc3\u5065\u5eb7\uff0c\u6211\u6253\u5fc3\u5e95\u66f4\u613f\u610f\u5c0f\u5b69\u5728 PHP \u793e\u533a\u6210\u957f\u3002<br /><br />\u53e6\u5916\uff0c\u4e0d\u7ba1\u559c\u4e0d\u559c\u6b22\u8fd9\u95e8\u8bed\u8a00\uff0c\u5c11\u6709\u4eba\u4f1a\u5426\u8ba4 PHP \u4e00\u76f4\u662f\u4e00\u95e8\u53ca\u5176\u5b9e\u7528\u4e14\u7a33\u5b9a\u7684\u8bed\u8a00\u3002\u5c24\u5176\u5728 web 1.0 \u65f6\u4ee3\uff0cPHP \u7edd\u5bf9\u662f\u6307\u54ea\u6253\u54ea\u7684\u5927\u6740\u5668\u3002\u54ea\u6015\u662f\u4eca\u5929\uff0c\u5feb\u901f\u8fed\u4ee3\u4e00\u4e2a\u4e2d\u5c0f\u578b\u5168\u6808\u9879\u76ee\uff0c\u5f88\u591a\u4eba\u90fd\u4f1a\u62ff\u8d77 Laravel/ThinkPHP \u3002\u800c\u73b0\u4ee3\u5316\u7684 PHP 8 \u66f4\u662f\u5438\u6536\u4e86\u5404\u5bb6\u6240\u957f\uff0cOOP \uff0c\u51fd\u6570\u5f0f\uff0c\u534f\u7a0b\uff0c\u53ef\u4ee5\u8bf4\u8981\u4ec0\u4e48\u6709\u4ec0\u4e48\u3002\u66f4\u96be\u80fd\u53ef\u8d35\u7684\u662f\u5728\u5feb\u901f\u8fed\u4ee3\u7684\u540c\u65f6\u4f9d\u7136\u4fdd\u6301\u4e86\u9ad8\u5ea6\u7684\u517c\u5bb9\u6027\u3002\u5bf9\u6bd4\u4e71\u6210\u4e00\u9505\u7ca5\u7684 Node/JS \uff0c\u5c0f\u5b69\u5199\u7684 PHP \u4ee3\u7801\uff0c\u4e0d\u7ba1\u662f\u8001\u8bed\u6cd5\uff0c\u8fd8\u662f\u65e7\u6846\u67b6\uff0c\u5f80\u5f80\u90fd\u80fd\u8fd0\u884c\uff0c\u6b63\u5411\u53cd\u9988\u9891\u7e41\u3002\u6211\u76f8\u4fe1\u73b0\u5728\u8fd9\u4e9b\u4ee3\u7801 5 \u5e74\u540e\u4f9d\u7136\u80fd\u6b63\u5e38\u8fd0\u884c\u3002<br /><br />\u770b\u5230\u8fd9\u91cc\uff0c\u60a8\u53ef\u80fd\u5c31\u660e\u767d\u6211\u4e3a\u4ec0\u4e48\u8bf4 PHP \u6709\u5149\u660e\u7684\u672a\u6765\u4e86\u3002\u540e\u6d6a\u63a8\u524d\u6d6a\uff0c\u4e16\u754c\u7ec8\u5f52\u662f\u6211\u4eec\u4e0b\u4e00\u4ee3\u7684\u3002\u5f53\u5b69\u5b50\u4eec\u9009\u62e9\u4e86 PHP \uff0c\u4ed6\u4eec\u600e\u4e48\u4e0d\u4f1a\u518d\u4e00\u6b21\u4e3a PHP \u5e26\u6765\u9633\u5149\u5462\u3002<br /><br />\u2014 \u4e8e PHP 8.5 \u53d1\u5e03\u65e5"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lyxxxh2", 
        "name": "lyxxxh2", 
        "avatar": "https://cdn.v2ex.com/avatar/683e/710d/583505_large.png?m=1764570045"
      }, 
      "url": "https://www.v2ex.com/t/1169261", 
      "title": "\u8bb0\u4e00\u6b21\u5fae\u4fe1 access_token invalid credential, access_token is invalid or not latest", 
      "id": "https://www.v2ex.com/t/1169261", 
      "date_published": "2025-10-29T13:55:15+00:00", 
      "content_html": "<h2>\u573a\u666f</h2>\n<p>\u591a\u9879\u76ee\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7<code>access_token</code>,\u6bcf\u4e2a\u9879\u76ee\u7684<code>access_token</code>\u4e0d\u5171\u4eab,\u5c31\u4f1a:</p>\n<pre><code>{\"errcode\":40001,\"errmsg\":\"invalid credential, access_token is invalid or not latest, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r rid: \"}\n</code></pre>\n<h2>\u539f\u56e0</h2>\n<p>\"\u91cd\u590d\u83b7\u53d6\u5c06\u5bfc\u81f4\u4e0a\u6b21\u83b7\u53d6\u7684 access_token \u5931\u6548\u3002\u5efa\u8bae\u5f00\u53d1\u8005\u4f7f\u7528\u4e2d\u63a7\u670d\u52a1\u5668\u7edf\u4e00\u83b7\u53d6\u548c\u5237\u65b0 access_token\"</p>\n<p>\u6587\u6863:<a href=\"https://developers.weixin.qq.com/doc/oplatform/developers/dev/AccessToken.html\" rel=\"nofollow\">https://developers.weixin.qq.com/doc/oplatform/developers/dev/AccessToken.html</a></p>\n<p>\u5de5\u4f5c\u8fd9\u4e48\u591a\u5e74,\u8fd8\u6ca1\u4ed4\u7ec6\u770b\u8fc7\u5fae\u4fe1\u6587\u6863\u3002</p>\n<h2>\u89e3\u51b3</h2>\n<p>\u641e\u4e2d\u63a7\u670d\u52a1\u5668\u9ebb\u70e6,\u4e5f\u61d2\u7740\u6362\u6210 reids \u3002</p>\n<p>\u6269\u5c55\u5305\u7528\u7684: w7corp/easywechat</p>\n<p>\u9ed8\u8ba4\u7528\u6587\u4ef6\u7684\u7f13\u5b58,\u4fdd\u8bc1\u7528\u540c\u4e2a\u6587\u4ef6\u5c31\u884c\u3002</p>\n<pre><code>$app-&gt;getAccessToken()-&gt;getKey()\n$app-&gt;getAccessToken()-&gt;getToken()\n\n// \u4e0d\u540c\u7248\u672c,\u65b9\u6cd5\u4e0d\u4e00\u6837\n$app-&gt;base-&gt;getAccessToken()-&gt;getTokenKey()\n$app-&gt;base-&gt;getAccessToken()-&gt;getToken()\n</code></pre>\n<hr/>\n<p>\u4e00\u5f00\u59cb\u6211\u4ee5\u4e3a\u6269\u5c55\u5305\u7684\u5751,\u4e00\u4e2a\u4e2a\u6392\u67e5,\u8fd8\u53bb\u5bf9\u6bd4\u7f13\u5b58\u6587\u4ef6\u7684 <code>token</code>\u3002</p>\n<p>\u6700\u540e\u4e00\u770b\u5fae\u4fe1\u6587\u6863,\u6211\u64e6 \u7ed3\u6848\u4e86\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/2024", 
        "name": "2024", 
        "avatar": "https://cdn.v2ex.com/avatar/509a/e14e/553106_large.png?m=1761298867"
      }, 
      "url": "https://www.v2ex.com/t/1168205", 
      "title": "\u91cd\u9020 PHP -HTTP \u6027\u80fd\u68c0\u6d4b\uff0c\u65b0\u589e List<int>\u3001HashMap<K, V>", 
      "id": "https://www.v2ex.com/t/1168205", 
      "date_published": "2025-10-24T09:49:50+00:00", 
      "content_html": "<p><a href=\"https://github.com/php-any/origami\" rel=\"nofollow\">https://github.com/php-any/origami</a></p>\n<p>\u5728\u8bbf\u95ee hello work \u573a\u666f\u4e0b\uff0c\u548c go http \u6807\u51c6\u5e93\u63a5\u8fd1\uff0c2 \u4e07\u5de6\u53f3 qps \u3002\n<img alt=\"text\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://tc.z.wiki/autoupload/fr/lUA4XBNOYMaj-2jOSFmwAAD9sdMXX6eSEkkkACYnYiuyl5f0KlZfm6UsKj-HyTuv/20251024/mHCL/916X588/0c284e9d5f3aa2c853c201777f1ef3e6.png\"/></p>\n<p>\u540c\u65f6\u65b0\u589e\u4e86\u66f4\u52a0\u4fbf\u6377\u7684\u67e5\u8be2</p>\n<pre><code class=\"language-php\">\n$db = open(\"mysql\", \"root:root@/temp\");\n\n$db-&gt;ping();\n\nDatabase\\registerDefaultConnection($db);\n\n@Table(\"users\")\nclass User {\n    public int $id;\n    \n    @Column(\"name\")\n    public string $userName;\n    \n    public int $age;\n    \n    public float $coin;\n    \n    @Column(\"create_at\")\n    public string $createAt;\n}\n\n$data = DB&lt;User&gt;();\n\necho \"=== \u57fa\u7840\u67e5\u8be2 ===\\n\";\n$user = $data-&gt;where(\"id = ?\", 100)-&gt;first();\ndump($user);\n</code></pre>\n<p>\u9664\u4e86 array \u6570\u7ec4\u5916\uff0c\u8fd8\u6709\u589e\u5f3a\u6570\u7ec4</p>\n<pre><code>$list = new List&lt;int&gt;();\n$list-&gt;add(1);\n$list-&gt;add(2);\n$list-&gt;add(3);\n\n// \u624b\u52a8\u8fed\u4ee3\n$list-&gt;rewind();\nwhile ($list-&gt;valid()) {\n    echo \"\u7d22\u5f15: \" . $list-&gt;key() . \", \u503c: \" . $list-&gt;current() . \"\\n\";\n    $list-&gt;next();\n}\n</code></pre>\n<p>KV \u65b9\u5f0f\u7684\u6cdb\u578b\u7c7b</p>\n<pre><code>$map = new HashMap&lt;string, int&gt;();\n$map-&gt;put(\"apple\", 10);\n$map-&gt;put(\"banana\", 20);\n$map-&gt;put(\"orange\", 30);\n</code></pre>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/hwhtj", 
        "name": "hwhtj", 
        "avatar": "https://cdn.v2ex.com/avatar/c7a8/558c/100031_large.png?m=1770429207"
      }, 
      "url": "https://www.v2ex.com/t/1160327", 
      "date_modified": "2025-09-18T13:23:31+00:00", 
      "content_html": "<p>`&lt;?php</p>\n<p>$nowtime=time();</p>\n<p>$pastsec = $nowtime - $_GET[\"t\"];</p>\n<p>if($pastsec&lt;600)\n{\nexit; //10 \u5206\u949f\u66f4\u65b0\u4e00\u6b21\uff0c\u65f6\u95f4\u53ef\u4ee5\u81ea\u5df1\u8c03\u6574\n}\nob_start(); //\u6253\u5f00\u7f13\u51b2\u533a\ninclude(\"index.php\");\n$content = ob_get_contents(); //\u5f97\u5230\u7f13\u51b2\u533a\u7684\u5185\u5bb9\n$content .= \"\\n&lt;script language=javascript src='/index/thumb.png' data-original=\"html.php?t=\".$nowtime.\"\"&gt;&lt;/script&gt;\"; //\u52a0\u4e0a\u8c03\u7528\u66f4\u65b0\u7a0b\u5e8f\u7684\u4ee3\u7801</p>\n<p>file_put_contents(\"index.html\",$content);\nif (!function_exists(\"file_put_contents\"))\n{\nfunction file_put_contents($fn,$fs)\n{\n$fp=fopen($fn,\"w+\");\nfputs($fp,$fs);\nfclose($fp);<br/>\n}\n}\n?&gt;`</p>\n<p>\u4ee5\u4e0a\u4ee3\u7801\u7528\u4e8e\u751f\u6210 typecho \u9996\u9875 index.html \uff0c\u8fd0\u884c\u65f6\u63d0\u793a\u9519\u8bef\uff1a\n<code>Warning: Undefined array key \"t\" in /www/onlineps.top/learn/html.php on line 3</code>\n\u6c42\u52a9\u9ad8\u624b\u5e2e\u6211\u6539\u5199\u4ee5\u4e0a\u4ee3\u7801\u3002</p>\n", 
      "date_published": "2025-09-18T13:22:32+00:00", 
      "title": "\u6c42\u52a9\uff1a PHP \u9519\u8bef\uff0c\u8bf7\u9ad8\u624b\u5e2e\u6211\u6539\u5199\u4e0b\u9762\u7684 PHP \u4ee3\u7801", 
      "id": "https://www.v2ex.com/t/1160327"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/fruitmonster", 
        "name": "fruitmonster", 
        "avatar": "https://cdn.v2ex.com/gravatar/f425ed8fb4fd47b9c0ea6ab846b72db4?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1158743", 
      "date_modified": "2025-09-12T05:51:27+00:00", 
      "content_html": "<p>\u770b\u5230\u6bd4\u8f83\u591a\u7684\u533a\u5757\u94fe\u3001\u94b1\u5305\u4e4b\u7c7b\u8fdc\u7a0b\u5de5\u4f5c\u90fd\u5f00\u59cb\u62db PHP \u4e86\uff0c\u8bf7\u95ee PHP \u662f\u6709\u4ec0\u4e48\u4f18\u52bf\u4e86\u5417\uff1f</p>\n", 
      "date_published": "2025-09-12T03:10:19+00:00", 
      "title": "\u4e3a\u4ec0\u4e48\u73b0\u5728 WEB3\u3001\u533a\u5757\u94fe\u3001\u94b1\u5305\u4e4b\u7c7b\u5f00\u59cb\u7528 PHP \u4e86", 
      "id": "https://www.v2ex.com/t/1158743"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/cj323", 
        "name": "cj323", 
        "avatar": "https://cdn.v2ex.com/gravatar/55d8713a4741083ba73747a518298a1f?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1155173", 
      "title": "PHP 8.5 \u52a0\u5165\u4e86 pipe \u8bed\u6cd5", 
      "id": "https://www.v2ex.com/t/1155173", 
      "date_published": "2025-08-27T01:25:32+00:00", 
      "content_html": "<p><a href=\"https://php.watch/versions/8.5/pipe-operator\" rel=\"nofollow\">https://php.watch/versions/8.5/pipe-operator</a></p>\n<pre><code>$result = \"Hello World\"\n    |&gt; strtoupper(...)\n    |&gt; str_shuffle(...)\n    |&gt; trim(...);\n</code></pre>\n<p>\u540c\u6837\u8bed\u6cd5 JS \u90a3\u8fb9\u5361\u4e86\u5f88\u4e45\uff0cPHP \u76f4\u63a5\u4e0a\u4e86\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/tg11", 
        "name": "tg11", 
        "avatar": "https://cdn.v2ex.com/gravatar/f336ff094ec4d6520b3e3bc570e8d2c3?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1154669", 
      "date_modified": "2025-08-25T01:48:39+00:00", 
      "content_html": "<p>\u8fd9\u662f\u6211\u67d0\u5929\u7a81\u7136\u60f3\u5230\u7684\uff0cpython \u7684 requests \u90a3\u4e48\u597d\u7528\uff0c\u4e3a\u4ec0\u4e48 php \u8981\u5199\u7684\u8fd9\u4e48\u53c8\u81ed\u53c8\u957f\u5462\uff1f\u6211\u5c31\u7ed3\u5408 claude code \u5199\u4e86\u4e00\u4e2a composer \u5305\uff0c\u5b8c\u5168\u4eff\u7167\u4e86 requests \u6a21\u5757\u3002\u6c42\u8f7b\u55b7\uff0c\u6b22\u8fce star \u3001pr</p>\n<p><a href=\"https://github.com/tg111/php-request\" rel=\"nofollow\">github \u5730\u5740</a> <a href=\"https://github.com/tg111/php-request\" rel=\"nofollow\">https://github.com/tg111/php-request</a></p>\n<p>\u76f4\u63a5\u5b89\u88c5</p>\n<pre><code>composer require tg111/php-request\n</code></pre>\n<h3>\u793a\u4f8b</h3>\n<pre><code class=\"language-php\">use PhpRequest\\PhpRequest;\n\n// \u7b80\u5355\u7684 GET \u8bf7\u6c42\n$response = PhpRequest::get('https://httpbin.org/get');\necho $response-&gt;text();\n\n// \u5e26\u53c2\u6570\u7684 GET \u8bf7\u6c42\n$response = PhpRequest::get('https://httpbin.org/get', [\n    'key1' =&gt; 'value1',\n    'key2' =&gt; 'value2'\n]);\n\n// POST \u8bf7\u6c42\n$response = PhpRequest::post('https://httpbin.org/post', [\n    'username' =&gt; 'user',\n    'password' =&gt; 'pass'\n]);\n\n// JSON POST \u8bf7\u6c42\n$response = PhpRequest::post('https://httpbin.org/post', [\n    'name' =&gt; '\u5f20\u4e09',\n    'email' =&gt; 'zhangsan@example.com'\n], [\n    'headers' =&gt; ['Content-Type' =&gt; 'application/json']\n]);\n</code></pre>\n<h3>\u4f7f\u7528\u5168\u5c40\u51fd\u6570</h3>\n<pre><code class=\"language-php\">$response = requests_get('https://httpbin.org/get');\n$response = requests_post('https://httpbin.org/post', ['key' =&gt; 'value']);\n</code></pre>\n<h3>\u81ea\u5b9a\u4e49\u8bf7\u6c42\u5934\u548c\u8eab\u4efd\u9a8c\u8bc1</h3>\n<pre><code class=\"language-php\">$response = PhpRequest::get('https://httpbin.org/cookies', [], [\n    'cookies' =&gt; [\n        'session_id' =&gt; 'abc123456789',\n        'user_preference' =&gt; 'dark_mode'\n    ]\n]);\n# cookies\n$response = PhpRequest::get('https://httpbin.org/cookies', [], [\n    'cookies' =&gt; [\n        'session_id' =&gt; 'abc123456789',\n        'user_preference' =&gt; 'dark_mode'\n    ]\n]);\n</code></pre>\n<h3>session \u4f1a\u8bdd\u7ba1\u7406</h3>\n<p>\u4f1a\u8bdd\u5141\u8bb8\u5728\u591a\u4e2a\u8bf7\u6c42\u4e4b\u95f4\u6301\u4e45\u5316 Cookie \u3001\u8bf7\u6c42\u5934\u548c\u5176\u4ed6\u914d\u7f6e\uff1a</p>\n<pre><code class=\"language-php\">use PhpRequest\\PhpRequest;\n\n// \u521b\u5efa\u4f1a\u8bdd\n$session = PhpRequest::session()\n    -&gt;setHeaders([\n        'Authorization' =&gt; 'Bearer token123',\n        'Accept' =&gt; 'application/json'\n    ])\n    -&gt;setCookies([\n        'session_id' =&gt; 'session123'\n    ])\n    -&gt;setTimeout(60);\n\n// \u4f7f\u7528\u4f1a\u8bdd\u8fdb\u884c\u591a\u4e2a\u8bf7\u6c42\n$profile = $session-&gt;get('/user/profile');\n$settings = $session-&gt;get('/user/settings');\n$updated = $session-&gt;post('/user/update', ['name' =&gt; '\u65b0\u540d\u79f0']);\n</code></pre>\n<h3>\u54cd\u5e94\u5bf9\u8c61</h3>\n<pre><code class=\"language-php\">$response = PhpRequest::get('https://httpbin.org/json');\n\n// \u83b7\u53d6\u54cd\u5e94\u5185\u5bb9\n$text = $response-&gt;text();           // \u539f\u59cb\u6587\u672c\u5185\u5bb9\n$data = $response-&gt;json();           // \u89e3\u6790 JSON \u54cd\u5e94\n$code = $response-&gt;getStatusCode();  // HTTP \u72b6\u6001\u7801\n\n// \u68c0\u67e5\u54cd\u5e94\u72b6\u6001\n$success = $response-&gt;ok();          // 2xx \u72b6\u6001\u7801\u4e3a true\n$isClientError = $response-&gt;isClientError(); // 4xx \u72b6\u6001\u7801\u4e3a true\n$isServerError = $response-&gt;isServerError(); // 5xx \u72b6\u6001\u7801\u4e3a true\n\n// \u83b7\u53d6\u5934\u90e8\u548c\u5143\u6570\u636e\n$headers = $response-&gt;getHeaders();\n$contentType = $response-&gt;getContentType();\n$totalTime = $response-&gt;getTotalTime();\n$url = $response-&gt;getUrl();\n\n// \u4fdd\u5b58\u54cd\u5e94\u5230\u6587\u4ef6\n$response-&gt;save('/path/to/file.json');\n</code></pre>\n", 
      "date_published": "2025-08-25T01:46:48+00:00", 
      "title": "\u63a8\u8350\u4e00\u4e2a\u4f18\u96c5\u7684 PHP http \u8bf7\u6c42\u5de5\u5177\uff0c\u4eff\u7167\u4e86 py \u7684 requests", 
      "id": "https://www.v2ex.com/t/1154669"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/mimiphp", 
        "name": "mimiphp", 
        "avatar": "https://cdn.v2ex.com/gravatar/c97c5e1b5a6392f107566fd8953d6bbb?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1153000", 
      "title": "\u5927\u5bb6\u597d\uff0c\u6211\u53c8\u4f86\u4e86\uff0c\u65b0\u4f5c\u54c1 https://www.freetalkhub.com\uff0c PHP \u5f00\u53d1", 
      "id": "https://www.v2ex.com/t/1153000", 
      "date_published": "2025-08-17T11:41:29+00:00", 
      "content_html": "<p>\u672c\u4eba\u662f php \u72ec\u7acb\u5f00\u53d1\u8005\uff0c\u4ee5\u524d\u7684\u8bdd\u9898 <a href=\"https://www.v2ex.com/t/994939\" rel=\"nofollow\">https://www.v2ex.com/t/994939</a>\n\u88ab\u540c\u884c\u55b7\u60e8\u4e86\u3002\u600e\u4e48\u8bf4\u5462\uff1f\u672c\u6765\u6211\u7684\u8bdd\u9898\u90fd\u662f\u53d1\u5728 php \u8282\u70b9\uff0c\u672c\u4ee5\u4e3a\u90fd\u662f php \u81ea\u5df1\u7684\u5f00\u53d1\u8005\u8ba8\u8bba\u3002\u4f46\u57fa\u4e8e\u6211\u4e2a\u4eba\u89c2\u70b9\uff0c\u5bfc\u81f4\u88ab\u8bc4\u4ef7\u4e3a\u53ea\u4f1a CURD \u5b9e\u5c5e\u4ee5\u5916\u3002</p>\n<p>\u672c\u4eba\u662f\u72ec\u7acb\u5f00\u53d1\u8005\uff0c\u6240\u4ee5\u66f4\u8d8b\u5411\u4e8e\u4e86\u89e3\u6574\u4e2a\u5f00\u53d1\u6d41\u7a0b\u7684\u6bcf\u4e2a\u7ec6\u8282\uff0c\u6bd5\u7adf\u9664\u4e86\u81ea\u5df1\uff0c\u6ca1\u6709\u4efb\u4f55\u5408\u4f5c\u56e2\u961f\u3002\n\u6211\u8ba4\u4e3a\u8bf4\u518d\u591a\u4e5f\u6ca1\u6709\u62ff\u4f5c\u54c1\u8bf4\u8bdd\u6bd4\u8f83\u5b9e\u5728\u3002\n\u672c\u4eba\u4ee5\u524d\u5c31\u804c\u4e8e\u9999\u6e2f\u627e\u6362\u5e97\u548c\u9910\u996e\u9879\u76ee\u5f00\u53d1\u7684\u516c\u53f8\u3002\u5e26\u9886\u56e2\u961f\u5f00\u53d1\u3002\u4f46\u5c31\u662f\u7531\u4e8e\u672c\u4eba\u7684\u89c2\u70b9\u662f\u975e\u4e3b\u6d41\u89c2\u70b9\uff0c\u5bfc\u81f4\u624b\u4e0b\u6709\u90e8\u5206\u4eba\u662f\u4e0d\u670d\u4ece\u7684\u3002</p>\n<p>\u7531\u4e8e php \u5728\u4e3b\u6d41\u7a0b\u5e8f\u5f00\u53d1\u754c\u88ab\u55e4\u4e4b\u4ee5\u9f3b\u591a\u6b21\uff0cphp \u5b98\u65b9\u7684\u5f00\u53d1\u56e2\u961f\u4e5f\u88ab\u5f3a\u7c7b\u578b\u8bed\u8a00\u5f00\u53d1\u8005\u53c2\u4e0e\u4e3b\u5bfc\u3002\u57fa\u4e8e\u6211\u672c\u4eba\u81ea\u5df1\u7684\u89c2\u70b9\uff0c\u611f\u89c9\u5f00\u53d1\u8fc7\u4e8e\u522b\u626d\u3002\u6240\u4ee5\u6211\u81ea\u5df1\u4ee5\u81ea\u5df1\u7684\u4f5c\u54c1\u4e3a\u76ee\u6807\u8003\u8651\u7b26\u5408\u81ea\u5df1\u7684\u6280\u672f\u6808\u603b\u7ed3\u4e86\u4e00\u5957\u5f00\u53d1\u601d\u8def\u3002</p>\n<p>\u672c\u4eba\u5c31\u804c\u671f\u95f4\u539f\u521b\u5f00\u53d1\u4e86\u4e00\u4e2a PHP \u5f00\u53d1\u6846\u67b6\uff0c\u539f\u540d\u4e3a mimiphp \uff0c\u5148\u6539\u540d\u4e3a lowphp\n\u7531\u4e8e PHP-FPM \u5b9e\u5728\u6027\u80fd\u592a\u5dee\uff0c\u57fa\u4e8e\u6211\u7684\u672c\u5730\u7535\u8111 AMD5600X wsl \u4e0b\u7684 debian12 \u7cfb\u7edf\uff0c\u4e5f\u53ea\u80fd\u5f04\u5230 500 \u5de6\u53f3\u7684\u5e76\u53d1\uff0c\u6ce8\u610f\u53ea\u662f echo 1;\u7b80\u5355\u811a\u672c\u6d4b\u8bd5\u7ed3\u679c\u3002\u800c\u5982\u679c\u662f\u9759\u6001\u6587\u4ef6\uff0c\u901a\u8fc7 nginx \u5904\u7406\uff0c\u53ef\u4ee5\u8fbe\u5230 6 \u4e07\u5e76\u53d1\u3002\n\u6240\u4ee5\u6211\u4fee\u6539\u4e86\u6846\u67b6\u6838\u5fc3\uff0c\u57fa\u4e8e swoole \u7684 cli \u6a21\u5f0f\uff0c\u652f\u6301\u4e86 swoole \u534f\u7a0b\u6a21\u5f0f\u3002\u5e76\u4e14\u5b8c\u6574\u52a0\u8f7d mysql \u6570\u636e\u548c\u6a21\u677f\u5f15\u64ce\u6e32\u67d3\u540e\u7684\u5e76\u53d1\u53ef\u4ee5\u8fbe\u5230 5000 \u5de6\u53f3\u3002\u6211\u975e\u5e38\u6ee1\u610f\u3002</p>\n<p>\u5982\u679c\u5355\u72ec\u5f00\u542f redis \u7f13\u5b58\u53ef\u4ee5\u8fbe\u5230 3 \u4e07\u5de6\u53f3\u5e76\u53d1\u3002\u5982\u679c\u5355\u72ec\u5f00\u542f apcu \u7f13\u5b58\u540e\u53ef\u4ee5\u8fbe\u5230 5 \u4e07\u5e76\u53d1\u3002\u8fd9\u5b9e\u5728\u662f\u7ed9\u529b\u4e86\u3002</p>\n<p>\u5176\u5b9e\u6211\u5e76\u4e0d\u60f3\u8ddf\u540c\u884c\u8fc7\u591a\u4e89\u8bba\uff0c\u56e0\u4e3a\u6211\u53d1\u73b0\u4e00\u4e2a\u73b0\u8c61\uff0c\u5c31\u662f\u6574\u4e2a\u4e2d\u6587\u793e\u533a\uff0c\u5176\u5b9e\u4efb\u4f55\u4e89\u8bba\u90fd\u5f97\u4e0d\u5230\u4e00\u4e2a\u6bd4\u8f83\u597d\u7684\u7ed3\u679c\u3002\u56e0\u4e3a\u53ef\u80fd\u7531\u4e8e\u6587\u5316\u7684\u5f71\u54cd\uff0c\u5927\u5bb6\u90fd\u4f1a\u4ee5\u81ea\u6211\u7684\u8ba4\u77e5\u4e3a\u4e2d\u5fc3\uff0c\u65b9\u5706\u51e0\u516c\u91cc\u4e4b\u5185\u5929\u4e0b\u65e0\u654c\u7684\u5fc3\u6001\u8bbd\u523a\u6316\u82e6\u522b\u4eba\u4e3a\u76ee\u7684\uff0c\u5b9e\u9645\u4e0a\u6839\u672c\u4e0d\u80fd\u5fc3\u5e73\u6c14\u548c\u7684\u8ba8\u8bba\u4efb\u4f55\u8bdd\u9898\u3002\u7279\u522b\u662f\u7a0b\u5e8f\u5f00\u53d1\u884c\u4e1a\u4ece\u67b6\u6784-\u8bed\u8a00-\u6846\u67b6-\u751a\u81f3\u5305\u62ec\u53d8\u91cf\u547d\u540d\u65b9\u5f0f\uff0c\u90fd\u662f\u6beb\u65e0\u610f\u4e49\u7684\u8bbd\u523a\u6316\u82e6\u3002\u5176\u5b9e\u5c31\u662f\u6d6a\u8d39\u65f6\u95f4\u7f62\u4e86\u3002\u5bf9\u4e8e\u6280\u672f\u7684\u63d0\u5347\u548c\u7406\u89e3\u90fd\u6beb\u65e0\u7528\u5904\u3002</p>\n<p>\u6211\u5176\u5b9e\u5728\u8fd9\u91cc\u53d1\u5e03\u8fc7\u4e24\u4e2a\u5e16\u5b50\uff0c\u4e00\u4e2a\u662f\u5173\u4e8e php8.3 \u7684\u8ba8\u8bba\u3002\u4e00\u4e2a\u662f ffsou \u641c\u7d22\u5f15\u64ce\u7684\u8ba8\u8bba\uff0c\u4e00\u4e2a 2023 \u5e74\uff0c\u4e00\u4e2a 2024 \u5e74\u3002\n\u6211\u662f\u76f4\u5230\u521a\u624d\u624d\u770b\u5230 php8.3 \u8ba8\u8bba\u7684\u5e16\u5b50\u6700\u540e\u4e00\u4e2a\u697c\u5c42\u5c45\u7136\u8ba4\u4e3a\u6211\u53ea\u662f\u4e00\u4e2a\u83dc\u9e1f\u3002\u3002\u8fd9\u8ba9\u6211\u5e72\u4e86 20 \u5e74\u7684\u7a0b\u5e8f\u5458\u5fc3\u91cc\u771f\u7684\u611f\u5230\u6df1\u6df1\u4f24\u5bb3\u3002</p>\n<p>\u5176\u5b9e\u6211\u4eec\u8fd9\u4e2a\u884c\u4e1a\uff0c\u672c\u8eab\u5927\u73af\u5883\u5c31\u975e\u5e38\u4e0d\u597d\uff0c\u672c\u6765\u6211\u4e0e\u9999\u6e2f\u7684\u4e00\u4e2a\u8001\u677f\u662f\u4ee5\u6280\u672f\u5165\u80a1\u7684\u65b9\u5f0f\u5408\u4f5c\uff0c\u53c8\u7531\u4e8e\u524d\u671f\u6ca1\u6709\u8d44\u91d1\u8058\u8bf7\u5176\u4ed6\u8bed\u8a00\u7684\u7a0b\u5e8f\u5458\uff0c\u800c\u6211\u53c8\u662f\u81ea\u4fe1\u80fd\u5f04\u597d\u9879\u76ee\u4e0a\u7ebf\u7684\u8001\u7a0b\u5e8f\u5458\uff0c\u6240\u4ee5\u4e5f\u5c31\u662f\u5b89\u5fc3\u7684\u5904\u7406\u4ee3\u7801\u4e86\u3002</p>\n<p>\u4f46\u6211\u6ca1\u6709\u60f3\u5230\u7684\u662f\uff1a2020 \u5e74\u5230 2024 \u5e74\u5e95\uff0c\u8fd9\u4e2a\u9999\u6e2f\u8001\u677f\u4e00\u76f4\u7ed9\u6211\u53cd\u9988\u7684\u90fd\u662f\u65e0\u6cd5\u6b63\u5e38\u76c8\u5229\uff0c\u53ea\u80fd\u52c9\u5f3a\u4fdd\u672c\u3002\u76f4\u5230 2024 \u5e74\u5e95\uff0c\u6211\u4ece\u5176\u4ed6\u9014\u5f84\u76f4\u5230\u4e86\u771f\u76f8\uff0c\u5176\u5b9e\u4ed6\u76c8\u5229\u65e9\u8fc7\u4e86 600 \u4e07\u4ee5\u4e0a\u3002\u800c\u4e14\u8fd8\u628a\u81ea\u5df1\u5bb6\u4eba\u52a0\u5165\u8fdb\u6765\u5403\u7a7a\u9977\u7b49\u7b49\u539f\u56e0\uff0c\u6211\u8fd8\u662f\u51b3\u5b9a\u4e3b\u52a8\u8f9e\u804c\u4e86\u3002</p>\n<p>\u53c8\u57fa\u4e8e\u884c\u4e1a\u9650\u5236\u89c4\u5219\u548c\u6cd5\u5f8b\u98ce\u9669\u7684\u8003\u8651\uff0c\u6211\u91cd\u5199\u4e86\u6211\u81ea\u5df1\u7684\u6846\u67b6\uff0c\u76ee\u524d\u662f\u72ec\u7acb\u5f00\u53d1\u8005\u8eab\u4efd\u3002\u7136\u540e\u8003\u8651\u76f4\u63a5\u8d70\u56fd\u9645\u8def\u7ebf\uff0c\u4e0e\u56fd\u5916\u7684\u7a0b\u5e8f\u5458\u6c9f\u901a\u4ea4\u6d41\u3002\u53d1\u73b0\u771f\u7684\u884c\u4e1a\u6587\u5316\u5dee\u5f02\u5b9e\u5728\u592a\u5927\u4e86\u3002</p>\n<p>\u6211\u5e0c\u671b\u6211\u4eec\u4f5c\u4e3a\u7b80\u4f53\u4e2d\u6587\u7684\u7a0b\u5e8f\u5458\uff0c\u5e94\u8be5\u8981\u81ea\u4fe1\uff0c\u548c\u7766\u76f8\u5904\uff0c\u591a\u4e0e\u540c\u884c\u6280\u672f\u4ea4\u6d41\uff0c\u800c\u4e0d\u662f\u8bbd\u523a\u6316\u82e6\u3002</p>\n<p>\u5f53\u7136\uff0c\u56fd\u5916\u540c\u6837\u662f\u4ee5\u4f5c\u54c1\u8bf4\u8bdd\u3002\u76ee\u524d\u7531\u4e8e\u91d1\u878d\u884c\u4e1a\u6d89\u53ca\u5230\u4e25\u683c\u7684\u8d44\u91d1\u6765\u6e90\u8ffd\u6eaf\u95ee\u9898\uff0c\u627e\u6362\u5e97\u5df2\u7ecf\u4e0d\u884c\u4e86\uff0c\u4f46\u5176\u4ed6\u65b9\u5411\uff0c\u7279\u522b\u662f AI \u4f7f\u7528\u4e0a\uff0c\u56fd\u5916\u51e0\u4e4e\u6bcf\u5929\u90fd\u6709\u51e0\u5341\u4e0a\u767e\u4e2a Saas \u9879\u76ee\u53d1\u5e03\u3002\u5f53\u7136\u5176\u4e2d\u4e5f\u6709\u6211\u4e00\u4efd\u529f\u52b3\uff0c\u8d5a\u4e86\u70b9\u5c0f\u94b1\u3002</p>\n<p>\u6240\u4ee5\u57fa\u4e8e\u4ee5\u4e0a\u7684\u524d\u63d0\uff0c\u6211\u60f3\u8bf4\u4e00\u4e0b\u6211\u8fd9\u4e2a <a href=\"https://www.freetalkhub.com\" rel=\"nofollow\">https://www.freetalkhub.com</a> \u662f\u53c2\u8003\u4e86 reddit \u548c discuz \u4ee5\u53ca\u5176\u4ed6\u793e\u533a\u540e\uff0c\u7528\u6211\u65b0\u5f00\u53d1\u7684 lowphp \u57fa\u4e8e swoole \u9ad8\u5e76\u53d1\u5f00\u53d1\u7684 php \u6846\u67b6\u5b8c\u6210\u3002</p>\n<p>\u5176\u4e2d\u524d\u7aef\u91c7\u7528\u5230\u4e86 vue3.0 \u7684 cdn \u6a21\u5f0f\uff0c\u4ee5\u53ca pjax \u4f2a\u5355\u9875\u6a21\u5f0f\u3002\u76ee\u524d\u6536\u5f55\u548c\u7528\u6237\u4f53\u9a8c\u90fd\u975e\u5e38\u597d\u3002</p>\n<p>\u5f53\u7136\uff0c\u8fd9\u662f\u4e00\u4e2a\u8bd5\u8fd0\u884c\u7ad9\u70b9\uff0c\u4e3b\u8981\u76ee\u7684\u8fd8\u662f\u5ba3\u4f20\u4e3a\u4e3b\u3002\n\u4f46\u6280\u672f\u6808\u6211\u662f\u60f3\u5f31\u5316\u524d\u7aef\u5de5\u7a0b\u5316\u7684\u4e3b\u6d41\u601d\u60f3\u3002\u6b22\u8fce\u4f53\u9a8c\u3002</p>\n<p>\u800c\u540e\u7aef php \u4e00\u76f4\u5728\u66f4\u65b0\uff0c\u6211\u4e5f\u91c7\u7528\u4e86\u6700\u65b0\u7684 php8.4 \u7248\u672c\u4e3a\u6838\u5fc3\u3002\u6211\u5e0c\u671b\u7528\u6211\u81ea\u5df1\u7684\u5b9e\u8df5\u548c\u4f5c\u54c1\uff0c\u4e3a php \u7684\u5f00\u53d1\u73af\u5883\u505a\u4e00\u4e2a\u8d21\u732e\u3002\u5e0c\u671b\u5927\u5bb6\u53c2\u4e0e\u8ba8\u8bba\u3002\u524d\u63d0\u662f\u7ad9\u5728\u5e73\u7b49\u7684\u4f4d\u7f6e\u4e0a\u3002\u4e0d\u8fc7\u4f60\u8bbd\u523a\u6316\u82e6\u4e5f\u65e0\u6240\u8c13\uff0c\u5bf9\u4e8e\u6211\u6765\u8bf4\uff0c\u65e9\u5df2\u7ecf\u953b\u70bc\u51fa\u4e86\u6b7b\u732a\u4e0d\u6015\u5f00\u6c34\u70eb\u7684\u672c\u4e8b\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/sxszzhrrt", 
        "name": "sxszzhrrt", 
        "avatar": "https://cdn.v2ex.com/gravatar/23b764920ac763862cdf62a69d6e94cd?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1147927", 
      "title": "laravel \u548c thinkphp \u9009\u62e9\u54ea\u4e2a\uff1f", 
      "id": "https://www.v2ex.com/t/1147927", 
      "date_published": "2025-07-26T16:26:47+00:00", 
      "content_html": "\u95ee\u95ee laravel \u548c thinkphp \u9009\u62e9\u54ea\u4e2a\uff1f\u4e2a\u4eba\u5c0f\u9879\u76ee\uff0c\u8bf7\u5404\u4f4d\u4e0d\u8981\u63a8\u8350\u5176\u4ed6\u8bed\u8a00\u7684\uff0c\u4f8b\u5982 django \u4ec0\u4e48\u7684\u611f\u89c9\u90fd\u6709\u70b9\u6740\u9e21\u7528\u725b\u5200"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/heguangyu5", 
        "name": "heguangyu5", 
        "avatar": "https://cdn.v2ex.com/avatar/b740/e481/159374_large.png?m=1579242902"
      }, 
      "url": "https://www.v2ex.com/t/1134248", 
      "title": "202505 \u6700\u65b0\u8c03\u7814\uff1a PHP Opcode \u52a0\u5bc6\u6df7\u6dc6\u54ea\u5bb6\u5f3a?", 
      "id": "https://www.v2ex.com/t/1134248", 
      "date_published": "2025-05-26T00:47:27+00:00", 
      "content_html": "<p>\u8fd1\u6765\u770b\u5230\u6709\u7f51\u53cb\u54a8\u8be2 PHP \u6e90\u7801\u4fdd\u62a4\u3001\u9632\u7834\u89e3\u7684\u95ee\u9898, \u6211\u4e5f\u5f88\u4e45\u6ca1\u6709\u4e86\u89e3\u4e86. \u501f\u673a\u66f4\u65b0\u4e00\u4e0b\u81ea\u5df1\u7684\u8ba4\u8bc6, \u4e86\u89e3\u4e86\u89e3\u5e02\u573a\u73b0\u72b6.</p>\n<p>PHP \u6e90\u7801\u4fdd\u62a4\u65b9\u6848\u6709\u591a\u79cd,\u672c\u6587\u8bf4\u7684\u662f\u5bf9 opcode \u8fdb\u884c\u52a0\u5bc6\u6df7\u6dc6\u7684\u65b9\u6848.\u4e00\u822c\u8ba4\u4e3a,\u8fd9\u79cd\u65b9\u6848\u7684\u52a0\u5bc6\u5f3a\u5ea6\u8f83\u5f3a,\u4fdd\u62a4\u7a0b\u5ea6\u4e5f\u8f83\u9ad8.</p>\n<p>\u672c\u6587\u8c03\u7814\u4e86\u4e24\u6b3e PHP \u6e90\u7801\u52a0\u5bc6\u4ea7\u54c1.\u8c03\u7814\u8fc7\u7a0b\u4e2d\u5173\u6ce8\u4e24\u4e2a\u91cd\u70b9:</p>\n<ol>\n<li>\u5982\u4f55\u62ff\u5230\u52a0\u5bc6\u6df7\u6dc6\u540e\u7684 opcode.</li>\n<li>opcode \u80fd\u53cd\u7f16\u8bd1\u56de PHP \u4ee3\u7801\u5417?</li>\n</ol>\n<p>\u4e3a\u4e86\u4e0d\u5bf9\u4ea7\u54c1\u672c\u8eab\u9020\u6210\u4e0d\u597d\u7684\u5f71\u54cd, \u6211\u4eec\u79f0\u8fd9\u4e24\u6b3e\u4ea7\u54c1\u5206\u522b\u4e3a <strong>AAA</strong> \u548c <strong>BBB</strong>.</p>\n<p>AAA \u662f\u56fd\u5185\u4ea7\u54c1,\u53f7\u79f0 \"\u6700\u4f73 PHP \u6e90\u4ee3\u7801\u52a0\u5bc6\u7f16\u8bd1\u5668\".</p>\n<p>BBB \u662f\u56fd\u5916\u4ea7\u54c1,\u53f7\u79f0 \"the most widely trusted PHP protection tool\".</p>\n<p>\u5148\u6765\u770b AAA.</p>\n<h2>AAA</h2>\n<p>\u9996\u5148,\u6211\u4eec\u9700\u8981\u4e00\u6bb5 PHP \u4ee3\u7801\u4f5c\u4e3a\u88ab\u4fdd\u62a4\u5bf9\u8c61.\u8fd9\u91cc\u9009\u53d6\u4e00\u4e2a\u5bf9 <code>PDO</code> \u7c7b\u8fdb\u884c\u7b80\u6613\u5c01\u88c5\u7684 Db \u7c7b. \u5b8c\u6574\u6e90\u7801\u89c1: <a href=\"https://github.com/heguangyu5/PHPUnit-in-Action-Code/blob/master/ourblog/lib/OurBlog/Db.php\" rel=\"nofollow\">Db.php</a></p>\n<p>\u7136\u540e,\u4f7f\u7528 <strong>AAA \u8bd5\u7528\u7248</strong> \u5bf9<code>Db.php</code> \u52a0\u5bc6, \u52a0\u5bc6\u65f6\u9009\u62e9 <strong>PHP \u7248\u672c 8.0</strong>,\u52a0\u5bc6\u5b8c\u6210\u540e\u4e0b\u8f7d\u56de\u6765,\u7136\u540e\u5c06\u5bf9\u5e94\u7684 <code><a href=\"http://AAA_loader_80_nts.so\" rel=\"nofollow\">AAA_loader_80_nts.so</a></code>\u4e5f\u4e0b\u8f7d\u56de\u6765.</p>\n<p>php \u7684 opcache \u6269\u5c55\u6709\u4e2a\u65b9\u4fbf\u7684\u529f\u80fd,\u53ef\u4ee5\u628a php \u4ee3\u7801\u7684 opcode dump \u51fa\u6765.</p>\n<pre><code class=\"language-shell\">$ ~/tmp/php-8.0.30/bin/php -d 'opcache.enable_cli=1' -d 'opcache.opt_debug_level=0x10000' ../Db.php\n\n$_main:\n     ; (lines=1, args=0, vars=0, tmps=0)\n     ; (before optimizer)\n     ; /home/hgy/Downloads/php-opcode-test/Db.php:1-97\n     ; return  [] RANGE[0..0]\n0000 RETURN int(1)\n\nOurBlog_Db::__construct:\n     ; (lines=36, args=0, vars=0, tmps=18)\n     ; (before optimizer)\n     ; /home/hgy/Downloads/php-opcode-test/Db.php:9-17\n     ; return  [] RANGE[0..0]\n0000 V1 = NEW 3 string(\"PDO\")\n0001 INIT_FCALL 1 96 string(\"getenv\")\n0002 SEND_VAL string(\"DB_HOST\") 1\n0003 V2 = DO_ICALL\n0004 T3 = CONCAT string(\"mysql:host=\") V2\n0005 T4 = CONCAT T3 string(\";port=\")\n0006 INIT_FCALL 1 96 string(\"getenv\")\n0007 SEND_VAL string(\"DB_PORT\") 1\n0008 V5 = DO_ICALL\n0009 T6 = CONCAT T4 V5\n0010 T7 = CONCAT T6 string(\";dbname=\")\n0011 INIT_FCALL 1 96 string(\"getenv\")\n0012 SEND_VAL string(\"DB_DATABASE\") 1\n0013 V8 = DO_ICALL\n0014 T9 = CONCAT T7 V8\n0015 T10 = CONCAT T9 string(\";charset=utf8\")\n0016 SEND_VAL_EX T10 1\n\n// \u7531\u4e8e V2EX \u9650\u5236\u4e3b\u9898\u5185\u5bb9\u4e0d\u80fd\u8d85\u8fc7 20000 \u4e2a\u5b57\u7b26,\u8fd9\u91cc\u5220\u9664\u4e86\u4f59\u4e0b\u7684 opcode\n</code></pre>\n<p>\u73b0\u5728\u6211\u4eec\u62ff\u5230\u4e86 <code>Db.php</code> \u672a\u52a0\u5bc6\u6df7\u6dc6\u7684 opcode.</p>\n<p>\u518d\u6765\u770b\u770b AAA \u52a0\u5bc6\u6df7\u6dc6\u8fc7\u7684 <code>Db-AAA.php</code> \u7684 opcode \u957f\u4ec0\u4e48\u6837.\n\u5c06 <code><a href=\"http://AAA_loader_80_nts.so\" rel=\"nofollow\">AAA_loader_80_nts.so</a></code> \u52a0\u5230 <code>php.ini</code> \u91cc\u5e76\u914d\u7f6e\u597d.</p>\n<pre><code class=\"language-shell\">~/tmp/php-8.0.30/bin/php -d 'opcache.enable_cli=1' -d 'opcache.opt_debug_level=0x1000' Db-AAA.php\n</code></pre>\n<p>\u4ec0\u4e48\u8f93\u51fa\u90fd\u6ca1\u6709.</p>\n<p>\u53ef\u4ee5\u7406\u89e3,\u5e94\u8be5\u662f <code><a href=\"http://AAA_loader_80_nts.so\" rel=\"nofollow\">AAA_loader_80_nts.so</a></code> \u6765\u63a5\u7ba1\u5904\u7406 <code>Db-AAA.php</code>, opcache \u6269\u5c55\u4e0d\u8d77\u4f5c\u7528\u4e86.</p>\n<p>\u90a3\u8fd8\u6709\u4ec0\u4e48\u529e\u6cd5\u80fd\u62ff\u5230 opcode \u5417?\u53ef\u4ee5\u7528 <code>phpdbg</code>.</p>\n<pre><code class=\"language-shell\">$ ~/tmp/php-8.0.30/bin/phpdbg -p* Db-AAA.php\nfunction name: (null)\nL1-97 {main}() /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php - 0x719eb1e09cb0 + 1 ops\n L97   #0     FETCH_DIM_W&lt;-1&gt;         1                    NEXT\n\n\nuser class: OurBlog_Db\n10 methods: __construct, __clone, getInstance, fetchOne, fetchRow, fetchAll, fetchCol, insert, update, __call\n\nfunction name: __construct\nL9-17 OurBlog_Db::__construct() /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php - 0x719eb1e065a0 + 36 ops\n L11   #0     NEW&lt;3&gt;                  \"PDO\"                                     @0\n L2147483647 #1     YIELD&lt;1&gt;                                                          \"VTM]\\\\V\"\n L1073741823 #2     PRE_INC                                      \"ssipe  \"\n L12   #3     DO_FCALL                                                          @1\n L12   #4     FETCH_DIM_W             \"mysql:host=\"        @1                   ~2\n L12   #5     FETCH_DIM_W             ~2                   \";port=\"             ~1\n L2147483647 #6     MATCH_ERROR&lt;1&gt;                                                    \"VTM]\\\\V\"\n L1073741823 #7     JMPZ_EX                                      \"ssihe  \"\n L12   #8     DO_FCALL                                                          @3\n L12   #9     FETCH_DIM_W             ~1                   @3                   ~2\n L12   #10    FETCH_DIM_W             ~2                   \";dbname=\"           ~1\n L2147483647 #11    MATCH_ERROR&lt;1&gt;                                                    \"VTM]\\\\V\"\n L1073741823 #12    JMPZ_EX                                      \"usmru~  eyu\"\n L12   #13    DO_FCALL                                                          @3\n L12   #14    FETCH_DIM_W             ~1                   @3                   ~2\n L12   #15    FETCH_DIM_W             ~2                   \";charset=utf8\"      ~1\n\n// \u7531\u4e8e V2EX \u9650\u5236\u4e3b\u9898\u5185\u5bb9\u4e0d\u80fd\u8d85\u8fc7 20000 \u4e2a\u5b57\u7b26,\u8fd9\u91cc\u5220\u9664\u4e86\u4f59\u4e0b\u7684 opcode\n\n[Script ended normally]\n</code></pre>\n<p>\u4e0d\u8fc7 <code>phpdbg</code> \u8f93\u51fa\u7684 opcode \u6ca1\u6709 opcache \u8f93\u51fa\u7684\u6613\u8bfb,\u6bd4\u5982\u6700\u540e\u4e00\u4e2a\u51fd\u6570<code>OurBlog_Db::__call()</code>\u91cc\u7684<code>call_user_func_array()</code>\u6ca1\u663e\u793a\u5b8c\u6574,\u53ea\u663e\u793a\u4e86\u4e2a<code>call_user_func_ar</code>.</p>\n<p>\u6709\u6ca1\u6709\u529e\u6cd5\u8ba9 <strong>php-8.0.30 \u7684 phpdbg</strong> \u8f93\u51fa\u50cf opcache \u90a3\u79cd\u6837\u5f0f\u7684 opcode \u5462?</p>\n<p>\u8fd9\u91cc\u53ea\u6240\u4ee5\u8981\u5f3a\u8c03 <strong>php-8.0.30 \u7684 phpdbg</strong> , \u662f\u56e0\u4e3a <strong>php-8.3 \u7684 phpdbg</strong> \u8f93\u51fa\u7684 opcode \u5df2\u7ecf\u548c opcache \u98ce\u683c\u7edf\u4e00\u4e86.</p>\n<p>\u6211\u4eec\u53ef\u4ee5\u5bf9 phpdbg \u7a0d\u505a\u4fee\u6539,\u628a opcache \u8f93\u51fa opcode \u7684\u4ee3\u7801\u7528\u5728 phpdbg \u91cc,\u8fd9\u6837\u5c31\u53ef\u4ee5\u4e86.</p>\n<p>\u7ed9 phpdbg \u65b0\u52a0\u4e00\u4e2a\u53c2\u6570<code>-p**</code>,\u6765\u8c03\u7528 opcache \u91cc\u7684 dump \u76f8\u5173\u4ee3\u7801.</p>\n<pre><code class=\"language-shell\">$ ~/tmp/php-8.0.30/bin/phpdbg -p** Db-AAA.php\n\n$_main:\n     ; (lines=1, args=0, vars=0, tmps=0)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:1-97\n     ; return  []\n0000 FETCH_DIM_W int(1) NEXT\n\nOurBlog_Db::__construct:\n     ; (lines=36, args=0, vars=0, tmps=4, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:9-17\n     ; return  [class] RANGE[--..136834057266072]\n0000 V0 = NEW 3 string(\"PDO\")\n0001 YIELD (function) string(\"VTM]\\V\")\n0002 PRE_INC string(\"ssipe\")\n0003 V1 = DO_FCALL\n0004 T2 = FETCH_DIM_W string(\"mysql:host=\") V1\n0005 T1 = FETCH_DIM_W T2 string(\";port=\")\n0006 MATCH_ERROR string(\"VTM]\\V\")\n0007 JMPZ_EX string(\"ssihe\")\n0008 V3 = DO_FCALL\n0009 T2 = FETCH_DIM_W T1 V3\n0010 T1 = FETCH_DIM_W T2 string(\";dbname=\")\n0011 MATCH_ERROR string(\"VTM]\\V\")\n0012 JMPZ_EX string(\"usmru~eyu\")\n0013 V3 = DO_FCALL\n0014 T2 = FETCH_DIM_W T1 V3\n0015 T1 = FETCH_DIM_W T2 string(\";charset=utf8\")\n0016 OP_242 T1\n0017 BOOL_XOR string(\"VTM]\\V\")\n0018 FE_RESET_RW string(\"ssimy\t\")\n0019 V1 = DO_FCALL\n0020 SEND_USER V1 2\n0021 MATCH_ERROR string(\"VTM]\\V\")\n0022 OP_244 string(\"usmfuy\n                          kxt\")\n0023 V1 = DO_FCALL\n0024 SEND_USER V1 3\n0025 DO_FCALL\n0026 FETCH_DIM_W string(\"pdo\")\n0027 FETCH_DIM_W V0 NEXT\n0028 EXT_STMT T0 string(\"FTY\")\n0029 CASE T0 string(\"AVMw@TS)FGLU\")\n0030 T0 = FETCH_DIM_W string(\"PDO\") string(\"ATTR_ERRMODE\")\n0031 SR T0\n0032 T0 = FETCH_DIM_W string(\"PDO\") string(\"ERRMODE_EXCEPTION\")\n0033 GET_CLASS T0\n0034 DO_FCALL\n0035 FETCH_DIM_W null NEXT\n\nOurBlog_Db::__clone:\n     ; (lines=1, args=0, vars=0, tmps=0)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:19-20\n     ; return  [undef, ref, class] RANGE[--..136834057268056]\n0000 FETCH_DIM_W null NEXT\n\nOurBlog_Db::getInstance:\n     ; (lines=9, args=0, vars=0, tmps=2, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:22-28\n     ; return  [] RANGE[--..2207613190024]\n0000 T1 = FETCH_DIM_W string(\"instance\") NEXT\n0001 T0 = FETCH_DIM_W T1 null\n0002 JMPZ T0 0007\n0003 V0 = NEW 0 (self) (exception)\n0004 DO_FCALL\n0005 FETCH_DIM_W string(\"instance\") NEXT\n0006 FETCH_DIM_W V0 NEXT\n0007 T0 = FETCH_DIM_W string(\"instance\") NEXT\n0008 FETCH_DIM_W T0 NEXT\n\nOurBlog_Db::fetchOne:\n     ; (lines=13, args=2, vars=3, tmps=1, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:30-35\n     ; return  [ref, class] RANGE[--..6262542]\n0000 CV0($Sh40) = RECV 1\n0001 CV1($Sh41) = RECV_INIT 2 array(...)\n0002 OP_204 T3 string(\"FTY\")\n0003 FETCH_DIM_W T3 string(\"AA\\GXRD\")\n0004 SEND_USER CV0($Sh40) 1\n0005 V3 = DO_FCALL\n0006 CV2($Sh42) = FETCH_DIM_W V3 NEXT\n0007 BIND_LEXICAL (ref) CV2($Sh42) string(\"TK\\TLTD\")\n0008 SEND_USER CV1($Sh41) 1\n0009 DO_FCALL\n0010 OP_216 CV2($Sh42) string(\"TTMU_cN,Q_V\")\n0011 V3 = DO_FCALL\n0012 FETCH_DIM_W V3 NEXT\n\nOurBlog_Db::fetchRow:\n     ; (lines=15, args=3, vars=4, tmps=1, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:37-42\n     ; return  [class] RANGE[--..136834057270096]\n0000 CV0($Sh43) = RECV 1\n0001 CV1($Sh44) = RECV_INIT 2 array(...)\n0002 CV2($Sh45) = RECV_INIT 3 zval(type=11)\n0003 DECLARE_LAMBDA_FUNCTION T4 string(\"FTY\")\n0004 OP_216 T4 string(\"AA\\GXRD\")\n0005 SEND_USER CV0($Sh43) 1\n0006 V4 = DO_FCALL\n0007 CV3($Sh46) = FETCH_DIM_W V4 NEXT\n0008 SWITCH_STRING CV3($Sh46) 0008 string(\"TK\\TLTD\")\n0009 SEND_USER CV1($Sh44) 1\n0010 DO_FCALL\n0011 BW_XOR CV3($Sh46) string(\"_\\LVH\")\n0012 SEND_USER CV2($Sh45) 1\n0013 V4 = DO_FCALL\n0014 FETCH_DIM_W V4 NEXT\n\nOurBlog_Db::fetchAll:\n     ; (lines=15, args=3, vars=4, tmps=1, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:44-49\n     ; return  [class] RANGE[--..136834057271416]\n0000 CV0($Sh47) = RECV 1\n0001 CV1($Sh48) = RECV_INIT 2 array(...)\n0002 CV2($Sh49) = RECV_INIT 3 zval(type=11)\n0003 OP_204 T4 string(\"FTY\")\n0004 OP_246 T4 string(\"AA\\GXRD\")\n0005 SEND_USER CV0($Sh47) 1\n0006 V4 = DO_FCALL\n0007 CV3($Sh410) = FETCH_DIM_W V4 NEXT\n0008 OP_220 CV3($Sh410) string(\"TK\\TLTD\")\n0009 SEND_USER CV1($Sh48) 1\n0010 DO_FCALL\n0011 YIELD_FROM CV3($Sh410) string(\"WPMT^aM,\")\n0012 SEND_USER CV2($Sh49) 1\n0013 V4 = DO_FCALL\n0014 FETCH_DIM_W V4 NEXT\n\nOurBlog_Db::fetchCol:\n     ; (lines=15, args=2, vars=3, tmps=1, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:51-56\n     ; return  [ref, class] RANGE[--..136834057272704]\n0000 CV0($Sh411) = RECV 1\n0001 CV1($Sh412) = RECV_INIT 2 array(...)\n0002 OP_222 T3 string(\"FTY\")\n0003 FETCH_DIM_W T3 string(\"AA\\GXRD\")\n0004 SEND_USER CV0($Sh411) 1\n0005 V3 = DO_FCALL\n0006 CV2($Sh413) = FETCH_DIM_W V3 NEXT\n0007 CASE CV2($Sh413) string(\"TK\\TLTD\")\n0008 SEND_USER CV1($Sh412) 1\n0009 DO_FCALL\n0010 BIND_LEXICAL (ref) CV2($Sh413) string(\"WPMT^aM,\")\n0011 T3 = FETCH_DIM_W string(\"PDO\") string(\"FETCH_COLUMN\")\n0012 OP_231 T3\n0013 V3 = DO_FCALL\n0014 FETCH_DIM_W V3 NEXT\n\nOurBlog_Db::insert:\n     ; (lines=55, args=2, vars=7, tmps=5, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:58-74\n     ; return  [class] RANGE[--..136834057274120]\n0000 CV0($Sh414) = RECV 1\n0001 CV1($Sh415) = RECV 2\n0002 JMPNZ CV1($Sh415) 0011\n0003 CONCAT T7 string(\"FTY\")\n0004 SWITCH_STRING T7 0004 string(\"RA][\")\n0005 T8 = DECLARE_ANON_CLASS string(\"INSERT INTO `\")\n0006 T8 = DECLARE_ANON_CLASS T8 CV0($Sh414)\n0007 T7 = FETCH_DIM_W T8 string(\"` VALUES (NULL)\")\n0008 OP_228 T7\n0009 DO_FCALL\n0010 FETCH_DIM_W null NEXT\n0011 CV2($Sh416) = FETCH_DIM_W array(...) NEXT\n0012 DEFINED string(\"PKKVIJ%]A\")\n0013 SEND_USER CV1($Sh415) 1\n0014 V8 = DO_FCALL\n0015 V7 = FETCH_DIM_W V8 NEXT\n0016 FETCH_DIM_W V7 CV3($Sh417)\n0017 T9 = DECLARE_ANON_CLASS string(\"`\")\n0018 T9 = DECLARE_ANON_CLASS T9 CV3($Sh417)\n0019 T8 = FETCH_DIM_W T9 string(\"`\")\n0020 FETCH_DIM_W CV2($Sh416) NEXT\n0021 FETCH_DIM_W T8 NEXT\n0022 FETCH_DIM_W NEXT\n0023 FE_FREE V7\n0024 BW_NOT string(\"X^I[VDD\")\n0025 FETCH_OBJ_IS THIS string(\"\")\n0026 SEND_USER CV2($Sh416) 2\n0027 V7 = DO_FCALL\n0028 FETCH_DIM_W CV2($Sh416) V7\n0029 MUL string(\"BMKhBEQ%EF\")\n\")30 FE_RESET_RW string(\"\n0031 T8 = FETCH_DIM_W CV1($Sh415) NEXT\n0032 T7 = FETCH_DIM_W T8 int(1)\n0033 SEND_USER T7 2\n0034 V8 = DO_FCALL\n0035 CV4($Sh418) = FETCH_DIM_W V8 string(\"?\")\n0036 T8 = DECLARE_ANON_CLASS string(\"INSERT INTO `\")\n0037 T8 = DECLARE_ANON_CLASS T8 CV0($Sh414)\n0038 T8 = DECLARE_ANON_CLASS T8 string(\"` (\")\n0039 T8 = DECLARE_ANON_CLASS T8 CV2($Sh416)\n0040 T8 = DECLARE_ANON_CLASS T8 string(\") VALUES (\")\n0041 T8 = DECLARE_ANON_CLASS T8 CV4($Sh418)\n0042 CV5($Sh419) = FETCH_DIM_W T8 string(\")\")\n0043 CONCAT T7 string(\"FTY\")\n0044 BIND_LEXICAL (ref) T7 string(\"AA\\GXRD\")\n0045 SEND_USER CV5($Sh419) 1\n0046 V7 = DO_FCALL\n0047 CV6($Sh420) = FETCH_DIM_W V7 NEXT\n0048 OP_216 CV6($Sh420) string(\"TK\\TLTD\")\n0049 MATCH_ERROR string(\"SAKWMW!HG]C\")\n0050 SEND_USER CV1($Sh415) 1\n0051 V7 = DO_FCALL\n0052 SEND_USER V7 1\n0053 DO_FCALL\n0054 FETCH_DIM_W null NEXT\n\nOurBlog_Db::update:\n     ; (lines=44, args=3, vars=7, tmps=4, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:76-90\n     ; return  [class] RANGE[--..136834057277472]\n0000 CV0($Sh421) = RECV 1\n0001 CV1($Sh422) = RECV 2\n0002 CV2($Sh423) = RECV_INIT 3 string(\"1\")\n0003 JMPNZ CV1($Sh422) 0008\n0004 V7 = NEW 1 string(\"Exception\")\n0005 OP_226 string(\"update with empty row is not allowed!\")\n0006 DO_FCALL\n0007 FETCH_DIM_W V7 NEXT\n0008 CV3($Sh424) = FETCH_DIM_W array(...) NEXT\n0009 MUL string(\"PKKVIJ%]A\")\n0010 SEND_USER CV1($Sh422) 1\n0011 V8 = DO_FCALL\n0012 V7 = FETCH_DIM_W V8 NEXT\n0013 FETCH_DIM_W V7 CV4($Sh425)\n0014 T9 = DECLARE_ANON_CLASS string(\"`\")\n0015 T9 = DECLARE_ANON_CLASS T9 CV4($Sh425)\n0016 T8 = FETCH_DIM_W T9 string(\"` = ?\")\n0017 FETCH_DIM_W CV3($Sh424) NEXT\n0018 FETCH_DIM_W T8 NEXT\n0019 FETCH_DIM_W NEXT\n0020 FE_FREE V7\n0021 FETCH_FUNC_ARG (global) string(\"X^I[VDD\")\n0022 OP_205 string(\"\")\n0023 SEND_USER CV3($Sh424) 2\n0024 V7 = DO_FCALL\n0025 FETCH_DIM_W CV3($Sh424) V7\n0026 T8 = DECLARE_ANON_CLASS string(\"UPDATE `\")\n0027 T8 = DECLARE_ANON_CLASS T8 CV0($Sh421)\n0028 T8 = DECLARE_ANON_CLASS T8 string(\"` SET \")\n0029 T8 = DECLARE_ANON_CLASS T8 CV3($Sh424)\n0030 T8 = DECLARE_ANON_CLASS T8 string(\" WHERE \")\n0031 CV5($Sh426) = FETCH_DIM_W T8 CV2($Sh423)\n0032 POST_INC T7 string(\"FTY\")\n0033 BW_XOR T7 string(\"AA\\GXRD\")\n0034 SEND_USER CV5($Sh426) 1\n0035 V7 = DO_FCALL\n0036 CV6($Sh427) = FETCH_DIM_W V7 NEXT\n0037 OP_220 CV6($Sh427) string(\"TK\\TLTD\")\n0038 FETCH_FUNC_ARG string(\"SAKWMW!HG]C\")\n0039 SEND_USER CV1($Sh422) 1\n0040 V7 = DO_FCALL\n0041 SEND_USER V7 1\n0042 DO_FCALL\n0043 FETCH_DIM_W null NEXT\n\nOurBlog_Db::__call:\n     ; (lines=10, args=2, vars=2, tmps=2, dynamic, irreducable, extended_stmt, extended_fcall)\n     ; /home/hgy/Downloads/php-opcode-test/AAA/Db-AAA.php:92-95\n     ; return  [!ref, class] RANGE[--..109071675059458]\n0000 CV0($Sh428) = RECV 1\n0001 CV1($Sh429) = RECV 2\n0002 DECLARE_LAMBDA_FUNCTION T3 string(\"FTY\")\n0003 T2 = FETCH_DIM_W T3 NEXT\n0004 T2 = DECLARE_ANON_CLASS CV0($Sh428)\n0005 NEW 0 string(\"call_user_func_array\") T2\n0006 SEND_UNPACK CV1($Sh429)\n0007 FETCH_DIM_W NEXT\n0008 V2 = DO_FCALL\n0009 FETCH_DIM_W V2 NEXT\n[Script ended normally]\n</code></pre>\n<p>\u597d,\u73b0\u5728\u6211\u4eec\u62ff\u5230\u4e86 AAA \u52a0\u5bc6\u6df7\u6dc6\u8fc7\u7684 opcode.</p>\n<p>\u63a5\u4e0b\u6765\u5c31\u8981\u628a\u8fd9\u4e9b opcode \u7ed9\u53cd\u7f16\u8bd1\u6210 PHP \u4ee3\u7801.\n\u8fd9\u53ef\u4e0d\u597d\u5f04.\n\u4e0d\u8fc7\u597d\u5728\u6709 AI \u5927\u6a21\u578b,\u662f\u65f6\u5019\u5c55\u73b0 AI \u771f\u6b63\u7684\u5b9e\u529b\u4e86!</p>\n<p>\u4ee5\u4e0b\u662f Google Gemini \u53cd\u7f16\u8bd1\u7684\u7ed3\u679c:</p>\n<p>@see <a href=\"https://g.co/gemini/share/148782890130\" rel=\"nofollow\">https://g.co/gemini/share/148782890130</a></p>\n<p>\u5927\u5bb6\u53ef\u4ee5\u81ea\u884c\u5bf9\u6bd4\u4e00\u4e0b,\u53cd\u6b63\u6211\u662f\u88ab\u9707\u60ca\u5230\u4e86!</p>\n<p>\u4e5f\u6709\u53ef\u80fd <code>Db.php</code> \u7684\u4ee3\u7801\u8f83\u4e3a\u5e38\u89c1,\u88ab AI \u8499\u5bf9\u4e86.</p>\n<p>\u817e\u8baf\u5143\u5b9d DeepSeek-R1 \u53cd\u7f16\u8bd1\u7684\u7ed3\u679c\u5982\u4e0b:</p>\n<p>@see <a href=\"https://yuanbao.tencent.com/bot/app/share/chat/KUiqoTNjZalJ\" rel=\"nofollow\">https://yuanbao.tencent.com/bot/app/share/chat/KUiqoTNjZalJ</a></p>\n<p>AAA \u7684\u8c03\u7814\u6211\u4eec\u5148\u5230\u8fd9\u91cc.</p>\n<p>AAA \u7559\u7ed9\u6211\u4eec\u7684\u95ee\u9898\u662f, opcode \u5230\u5e95\u80fd\u4e0d\u80fd\u7a0b\u5e8f\u5316\u5730\u53cd\u7f16\u8bd1\u6210 PHP \u4ee3\u7801.</p>\n<h2>BBB</h2>\n<p>\u53bb BBB \u7684\u7f51\u7ad9\u4e0a\u628a BBB \u7684 encoder \u8bd5\u7528\u7248 \u548c loader \u90fd\u4e0b\u8f7d\u56de\u6765.</p>\n<p>BBB \u7684 encoder \u6ca1\u6709 php-8.0 \u7248\u672c\u7684, \u90a3\u6211\u4eec\u5c31\u9009\u6700\u9ad8\u53ef\u7528\u7248\u672c php-8.3 \u7684.</p>\n<p>\u540c\u6837\u5bf9 <code>Db.php</code> \u8fdb\u884c\u52a0\u5bc6, \u5f97\u5230\u52a0\u5bc6\u540e\u7684\u6587\u4ef6 <code>Db-BBB.php</code></p>\n<pre><code class=\"language-shell\">./BBB_encoder_evaluation/BBB_encoder.sh -C -x86-64 -83 ../Db.php -o Db-BBB.php\n</code></pre>\n<p>\u63a5\u4e0b\u6765\u6211\u4eec\u7528\u540c\u6837\u7684\u529e\u6cd5\u5c1d\u8bd5\u62ff\u5230 <code>Db-BBB.php</code> \u7684 opcode.</p>\n<p>\u5c06 <code><a href=\"http://BBB_loader_lin_8.3.so\" rel=\"nofollow\">BBB_loader_lin_8.3.so</a></code> \u52a0\u5230 php.ini \u91cc\u914d\u7f6e\u597d.</p>\n<p>\u5148\u7528 opcache \u5c1d\u8bd5\u4e00\u4e0b:</p>\n<pre><code class=\"language-shell\">$ ~/tmp/php-8.3.21/bin/php -d 'opcache.enable_cli=1' -d 'opcache.opt_debug_level=0x1000' Db-BBB.php\n</code></pre>\n<p>\u6ca1\u6709\u4efb\u4f55\u8f93\u51fa.</p>\n<p>\u518d\u7528 phpdbg \u5c1d\u8bd5\u4e00\u4e0b:</p>\n<pre><code class=\"language-shell\">$ ~/tmp/php-8.3.21/bin/phpdbg -p* Db-BBB.php\nSegmentation fault (core dumped)\n</code></pre>\n<p>\u76f4\u63a5 segfault \u4e86.</p>\n<p>\u6211\u4eec\u4f7f\u7528 gdb \u6765\u8c03\u8bd5\u4e00\u4e0b.</p>\n<pre><code class=\"language-shell\">$ gdb ~/tmp/php-8.3.21/bin/phpdbg\n(gdb) b phpdbg_compile_file\n(gdb) r -p* ../Db.php\n(gdb) n\n(gdb)\n250\t\tret = PHPDBG_G(compile_file)(file, type);\n(gdb)\n251\t\tif (ret == NULL) {\n(gdb) set print pretty on\n(gdb) p *ret\n$1 = {\n  type = 2 '\\002',\n  arg_flags = \"\\000\\000\",\n  fn_flags = 100663296,\n  function_name = 0x0,\n  scope = 0x0,\n  prototype = 0x0,\n  num_args = 0,\n  required_num_args = 0,\n  arg_info = 0x0,\n  attributes = 0x0,\n  run_time_cache__ptr = 0x0,\n  T = 0,\n  cache_size = 0,\n  last_var = 0,\n  last = 1,\n  opcodes = 0x7ffff5002450,\n  static_variables_ptr__ptr = 0x0,\n  static_variables = 0x0,\n  vars = 0x0,\n  refcount = 0x7ffff5004008,\n  last_live_range = 0,\n  last_try_catch = 0,\n  live_range = 0x0,\n  try_catch_array = 0x0,\n  filename = 0x7ffff505e3c0,\n  line_start = 1,\n  line_end = 97,\n  doc_comment = 0x0,\n  last_literal = 1,\n  num_dynamic_func_defs = 0,\n  literals = 0x7ffff5002470,\n  dynamic_func_defs = 0x0,\n  reserved = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}\n}\n(gdb) c\nContinuing.\n...\n[Script ended normally]\n[Inferior 1 (process 187677) exited normally]\n\n(gdb) r -p* Db-BBB.php\n(gdb) n\n(gdb)\n250\t\tret = PHPDBG_G(compile_file)(file, type);\n(gdb)\n251\t\tif (ret == NULL) {\n(gdb) p *ret\n$2 = {\n  type = 2 '\\002',\n  arg_flags = \"\\000\\000\",\n  fn_flags = 100663296,\n  function_name = 0x0,\n  scope = 0x0,\n  prototype = 0x0,\n  num_args = 0,\n  required_num_args = 0,\n  arg_info = 0x0,\n  attributes = 0x0,\n  run_time_cache__ptr = 0x7ffff5004030,\n  T = 1,\n  cache_size = 0,\n  last_var = 0,\n  last = 0,\n  opcodes = 0x1,\n  static_variables_ptr__ptr = 0x0,\n  static_variables = 0x0,\n  vars = 0x0,\n  refcount = 0x7ffff5004020,\n  last_live_range = 0,\n  last_try_catch = 0,\n  live_range = 0x0,\n  try_catch_array = 0x0,\n  filename = 0x0,\n  line_start = 1,\n  line_end = 0,\n  doc_comment = 0x0,\n  last_literal = 0,\n  num_dynamic_func_defs = 0,\n  literals = 0x0,\n  dynamic_func_defs = 0x0,\n  reserved = {0x0, 0x0, 0x0, 0x7ffff5081460, 0x0, 0x0}\n}\n(gdb) quit\n</code></pre>\n<p>\u5bf9\u6bd4\u4e24\u6b21 <code>p *ret</code> \u4e0d\u96be\u53d1\u73b0, \u672a\u52a0\u5bc6\u7684 <code>Db.php</code>:</p>\n<p><code>opcodes = 0x7ffff5002450, reserved = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}</code></p>\n<p>\u5df2\u52a0\u5bc6\u7684 <code>Db-BBB.php</code>:</p>\n<p><code>opcodes = 0x1, reserved = {0x0, 0x0, 0x0, 0x7ffff5081460, 0x0, 0x0}</code></p>\n<p><code>0x1</code> \u663e\u7136\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u5185\u5b58\u5730\u5740,\u73b0\u5728 opcode \u5728\u54ea\u513f,\u4e0d\u597d\u627e\u4e86.</p>\n<p>\u518d\u6b21 gdb \u5173\u6ce8\u4e00\u4e0b <code>zend_compile_file</code> \u548c <code>zend_execute_ex</code>:</p>\n<pre><code class=\"language-shell\">$ gdb ~/tmp/php-8.3.21/bin/php\n(gdb) watch zend_compile_file\n(gdb) watch zend_execute_ex\n(gdb) r Db-BBB.php\n...\n(gdb)\nContinuing.\n\nHardware watchpoint 1: zend_compile_file\n\nOld value = (zend_op_array *(*)(zend_file_handle *, int)) 0x555555786ae0 &lt;phar_compile_file&gt;\nNew value = (zend_op_array *(*)(zend_file_handle *, int)) 0x7ffff40e5041\n0x00007ffff40571d4 in ?? () from /home/hgy/Downloads/php-opcode-test/BBB/BBB/BBB_loader_lin_8.3.so\n(gdb)\nContinuing.\n\nHardware watchpoint 2: zend_execute_ex\n\nOld value = (void (*)(zend_execute_data *)) 0x55555596adf0 &lt;execute_ex&gt;\nNew value = (void (*)(zend_execute_data *)) 0x7ffff40f2784\n0x00007ffff40571de in ?? () from /home/hgy/Downloads/php-opcode-test/BBB/BBB/BBB_loader_lin_8.3.so\n</code></pre>\n<p>\u53ef\u4ee5\u770b\u5230 <code><a href=\"http://BBB_loader_lin_8.3.so\" rel=\"nofollow\">BBB_loader_lin_8.3.so</a></code> \u65e2\u63a5\u7ba1\u4e86 <code>zend_compile_file</code>, \u53c8\u63a5\u7ba1\u4e86 <code>zend_execute_ex</code>.\n\u8fd9\u6837 opcodes \u5c31\u6210\u4e86\u4e2a\u9ed1\u76d2\u5b50, \u6211\u4eec\u65e2\u4e0d\u77e5\u9053\u5728\u54ea\u513f,\u4e5f\u4e0d\u77e5\u9053\u5185\u5bb9.</p>\n<p>\u8fd9\u600e\u4e48\u529e\u5462? \u662f\u4e0d\u662f\u8bf4 BBB \u8fd9\u4e2a\u4ea7\u54c1\u52a0\u5bc6\u5f3a\u5ea6\u975e\u5e38\u5f3a,\u503c\u5f97\u4fe1\u8d56\u5462?</p>\n<p>\u522b\u6025,\u7f51\u4e0a\u641c\u7d22\u4e00\u4e0b. \u5f88\u5feb\u5c31\u627e\u5230\u4e86\u8fd9\u4e2a <a href=\"https://dezender.xyz/\" rel=\"nofollow\">https://dezender.xyz/</a></p>\n<p>\u5728 DECODERS \u83dc\u5355\u91cc,\u5c31\u6709 BBB PHP 8.3, \u53ef\u4ee5\u5728\u7ebf\u8bd5\u7528,\u53ea\u4e0d\u8fc7\u53ea\u80fd decode 10 \u884c,\u6211\u4eec\u8bd5\u4e00\u4e0b.</p>\n<p>\u6210\u529f\u89e3\u5bc6.</p>\n<pre><code class=\"language-php\">&lt;?php\n/*\n * @ https://dezender.xyz - BBB Decoder Online\n * @ Decoder version: 3.0.0\n * @ Release: 2025/04/09\n */\nclass OurBlog_Db {\n\tprotected static $instance = null;\n\tprotected $pdo = null;\n\tprotected function __construct(){\n\t\t$this-&gt;pdo = new PDO(\"mysql:host=\" . getenv(\"DB_HOST\") . \";port=\" . getenv(\"DB_PORT\") . \";dbname=\" . getenv(\"DB_DATABASE\") . \";charset=utf8\", getenv(\"DB_USER\"), getenv(\"DB_PASSWORD\"));\n\t\t$this-&gt;pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n\t}\n\tprivate function __clone(){\n\t}\n\n// This is the demo version. Demo version decode 10 lines only.\n</code></pre>\n<p>\u7b80\u76f4\u592a\u5f3a\u4e86!!!</p>\n<h2>\u603b\u7ed3</h2>\n<ol>\n<li>AAA \u53ef\u4ee5\u6bd4\u8f83\u5bb9\u6613\u62ff\u5230\u52a0\u5bc6\u6df7\u6dc6\u8fc7\u7684 opcodes, \u4f46\u6ca1\u6709\u6210\u719f\u53ef\u7528\u7684\u53cd\u7f16\u8bd1\u5de5\u5177.</li>\n<li>BBB \u4e0d\u5bb9\u6613\u62ff\u5230\u52a0\u5bc6\u6df7\u6dc6\u8fc7\u7684 opcodes, \u4f46\u6709\u6210\u719f\u7684\u53cd\u7f16\u8bd1\u5de5\u5177.</li>\n</ol>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/tangknox1", 
        "name": "tangknox1", 
        "avatar": "https://cdn.v2ex.com/gravatar/a1a7952e770bca1b3c559bfdba68ac5b?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1128998", 
      "title": "\u6709\u505a\u8fc7\u57fa\u4e8e webrtc \u6280\u672f\u7684\u591a\u4eba\u89c6\u9891\u4f1a\u8bae\u7cfb\u7edf\u7684\u5417", 
      "id": "https://www.v2ex.com/t/1128998", 
      "date_published": "2025-04-29T14:01:38+00:00", 
      "content_html": "\u6709\u505a\u8fc7\u57fa\u4e8e webrtc \u6280\u672f\u7684\u591a\u4eba\u89c6\u9891\u4f1a\u8bae+\u591a\u4eba\u8bed\u97f3\u8fde\u9ea6\u7cfb\u7edf\u7684\u5417\uff1f<br /><br />\u591a\u4eba\u89c6\u9891\u4f1a\u8bae\uff1a\u4e3b\u6301\u4eba\uff08\u89c6\u9891\u76f4\u64ad\uff09+ \u5176\u4ed6\u4eba\u591a\u4eba\u8bed\u97f3\u8fde\u9ea6\u4e92\u52a8\uff0c\u6216\u8005 \u4e3b\u64ad\u76f4\u64ad + \u591a\u4eba\u8bed\u97f3\u8fde\u9ea6\u4e0e\u4e3b\u64ad\u4e92\u52a8\u3002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Tinywan", 
        "name": "Tinywan", 
        "avatar": "https://cdn.v2ex.com/avatar/62fd/0bb6/555337_large.png?m=1642057532"
      }, 
      "url": "https://www.v2ex.com/t/1128749", 
      "title": "2025 \u5e74 PHP \u8def\u5728\u4f55\u65b9", 
      "id": "https://www.v2ex.com/t/1128749", 
      "date_published": "2025-04-28T14:55:52+00:00", 
      "content_html": ""
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/TESTFLIGHT2021", 
        "name": "TESTFLIGHT2021", 
        "avatar": "https://cdn.v2ex.com/gravatar/f81d1103c117a67a0be5f6f3081250bc?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1128732", 
      "title": "\u6c42\u52a9 CodeIgniter \u8f93\u51fa\u7684 html \u683c\u5f0f\u5f88\u4e71\uff0c\u7f29\u8fdb\u4e71\u4e03\u516b\u7cdf\u7684\u3002\u3002\u3002", 
      "id": "https://www.v2ex.com/t/1128732", 
      "date_published": "2025-04-28T13:26:59+00:00", 
      "content_html": "\u53ef\u662f\u6211\u7684 view \u6a21\u677f\u6ca1\u95ee\u9898\u554a\uff1f<br />\u8bf7\u95ee\u8fd9\u600e\u4e48\u89e3\u51b3\u554a\uff1f"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/seansong", 
        "name": "seansong", 
        "avatar": "https://cdn.v2ex.com/gravatar/13b01d3f97cd23d88c602a486ccbc63c?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1128194", 
      "title": "\u6709\u4e2a\u5173\u4e8e PHP \u7684\u5c0f\u7591\u60d1", 
      "id": "https://www.v2ex.com/t/1128194", 
      "date_published": "2025-04-26T08:09:13+00:00", 
      "content_html": "\u7b2c\u4e00\u6b21\u5bf9\u63a5\u51e0\u4e2a php \u5199\u7684\u63a5\u53e3\uff0c\u9047\u5230\u4e00\u4e2a\u80fd\u7406\u89e3\u4f46\u60f3\u597d\u5947\u516b\u5366\u4e00\u4e0b\u7684\u7ec6\u8282\uff0c\u5bf9\u65b9\u63a5\u53e3\u8fd4\u56de json \uff0c\u5176\u4e2d\u6709\u4e2a\u5b57\u6bb5<br /><br />\"is_completed\": 0<br />\"is_completed\": \"0\"<br />\"is_completed\": false<br /><br />\u540c\u4e00\u4e2a\u63a5\u53e3\u8fd4\u56de\u7684\u5b8c\u5168\u4e00\u6837\u7684\u540c\u4e00\u4efd\u6570\u636e\uff0c\u4e3a\u4ec0\u4e48\u6bcf\u6b21\u8bf7\u6c42\uff0c\u5f97\u5230\u7684\u6570\u636e\u7c7b\u578b\u90fd\u4e0d\u4e00\u6837\u5462\uff0c\u800c\u4e14\u662f\u968f\u673a\u7684\uff0c\u6709\u65f6\u5019\u63a5\u53e3\u8fd4\u56de\u7684\u6570\u7ec4\u4e2d\uff0c\u4e0d\u540c\u5143\u7d20\u91cc\u9762\u7684\u8fd9\u4e2a\u5b57\u6bb5\uff0c\u90fd\u4f1a\u51fa\u73b0\u4e0d\u4e00\u6837\u7684\u7c7b\u578b\uff0c\u4ec0\u4e48\u573a\u666f\u4e0b\u4f1a\u51fa\u73b0\u8fd9\u79cd\u60c5\u51b5\uff0c\u4e2a\u522b\u7a0b\u5e8f\u5458\u641e\u6210\u8fd9\u6837\u7684\uff0c\u8fd8\u662f php \u751f\u6001\u4e2d\u5c31\u662f\u8fd9\u6837<br /><br />\u5f31\u7c7b\u578b\uff0c\u597d\u50cf\u80fd\u7406\u89e3\uff0c\u4f46\u5c31\u662f\u597d\u5947\u7f62\u4e86"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/awanganddong", 
        "name": "awanganddong", 
        "avatar": "https://cdn.v2ex.com/gravatar/e482df556a9ac0e4553da45a819ba931?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1127661", 
      "title": "workman \u4e0e\u963f\u91cc\u4e91\u5b9e\u65f6\u8bed\u97f3\u901a\u4fe1\u7684\u95ee\u9898\u3002", 
      "id": "https://www.v2ex.com/t/1127661", 
      "date_published": "2025-04-23T17:33:31+00:00", 
      "content_html": "<pre><code>    /**\n     * \u9879\u76ee socket \u8fde\u63a5\u65f6\u89e6\u53d1(\u4e00\u6b21)\n     * \u5f53\u5ba2\u6237\u7aef\u4e0e Workerman \u5efa\u7acb\u8fde\u63a5\u65f6(TCP \u4e09\u6b21\u63e1\u624b\u5b8c\u6210\u540e)\u89e6\u53d1\u7684\u56de\u8c03\u51fd\u6570\n     */\n    public static function onConnect($client_id)\n    {\n\n        // \u5b9a\u4e49\u8fde\u63a5\u51fd\u6570\n        $connectWs = function () {\n\n            $ws            = new AsyncTcpConnection('ws://dashscope.aliyuncs.com/api-ws/v1/inference');\n            $ws-&gt;headers   = [\n                \"Authorization\" =&gt; \"Bearer \" . getenv(\"DASHSCOPE_API_KEY\"),\n            ];\n            $ws-&gt;transport = \"ssl\";\n\n            // \u8fde\u63a5\u6210\u529f\u56de\u8c03\n            $ws-&gt;onConnect = function ($ws) {\n                self::$aliWs = $ws;\n                echo \"connected success:\" . $ws-&gt;id . \"\\n\";\n            };\n\n            // \u5f53\u6536\u5230\u6d88\u606f\u65f6\n            $ws-&gt;onMessage = function ($ws, $data) {\n                var_dump(\"ali \u8fd4\u56de\u6d88\u606f\", $data);\n                $msg     = json_decode($data, true);\n                $channel = self::$sendWsChan;\n                Coroutine::create(\n                    function () use ($channel, $msg) {\n                        $channel-&gt;push($msg);\n                    },\n                );\n            };\n\n            // \u8fde\u63a5\u5173\u95ed\u65f6\u8fdb\u884c\u91cd\u8fde\n            $ws-&gt;onClose = function ($ws) {\n                echo \"\u8fde\u63a5\u5173\u95ed\uff0c\u5c1d\u8bd5\u91cd\u65b0\u8fde\u63a5...\\n\";\n                self::$aliWs = null;\n                $ws-&gt;reConnect(1);\n            };\n            $ws-&gt;onError = function ($ws) {\n                echo \"\u9519\u8bef\u8f93\u51fa\" . $ws-&gt;error;\n            };\n            $ws-&gt;connect();\n        };\n        \n        \t\t//\u5b9a\u65f6\u5668\u89e6\u53d1\n                  if (self::$aliWs) {\n                                var_dump(\"\u53d1\u9001\u4e8b\u4ef6\");\n                                self::$aliWs-&gt;send(json_encode($data));\n                            }\n</code></pre>\n<p>\u521d\u6b21\u5efa\u7acb\u957f\u8fde\u63a5\u53ef\u4ee5\u53d1\u9001\u6210\u529f\uff0c\u4f46\u662f\u5982\u679c\u963f\u91cc\u4e91\u957f\u8fde\u63a5\u65ad\u7ebf\u91cd\u8fde\u51e0\u6b21\u540e\uff0c\u53d1\u9001\u4e8b\u4ef6\uff0c\u5728 onMessage \u91cc\u8fb9\u6ca1\u6709\u54cd\u5e94\u3002\u4e0d\u660e\u767d\u4e3a\u4ec0\u4e48\u51fa\u73b0\u8fd9\u79cd\u60c5\u51b5\u3002var_dump(\"\u53d1\u9001\u4e8b\u4ef6\"); \u53ef\u4ee5\u6253\u5370\u6570\u636e\u3002\u4f46\u662f onMessage \u4e0d\u5b58\u5728\u6570\u636e\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/xmlf", 
        "name": "xmlf", 
        "avatar": "https://cdn.v2ex.com/avatar/11cd/92da/230161_large.png?m=1668495807"
      }, 
      "url": "https://www.v2ex.com/t/1126479", 
      "title": "\u76ee\u524d PHP \u4e2d\u6bd4\u8f83\u597d\u7528\u7684\u5de5\u4f5c\u6d41\u5f15\u64ce\u6709\u54ea\u4e9b\uff1f", 
      "id": "https://www.v2ex.com/t/1126479", 
      "date_published": "2025-04-18T07:18:46+00:00", 
      "content_html": "\u8981\u5f00\u53d1\u5ba1\u6279\u7cfb\u7edf\u3002\u73b0\u5728\u6bd4\u8f83\u597d\u7528\u6216\u8005\u5f00\u6e90\u7684\u5de5\u4f5c\u6d41\u5f15\u64ce\u6709\u54ea\u4e9b\uff1f<br /><br />\u5404\u4f4d\u5927\u4f6c\u5e2e\u5fd9\u63a8\u8350\u63a8\u8350\u3002\u3002\u3002\u4f60\u4eec\u5e73\u65f6\u90fd\u7528\u4ec0\u4e48\u5de5\u4f5c\u6d41\u5f15\u64ce\uff1f"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/carl92", 
        "name": "carl92", 
        "avatar": "https://cdn.v2ex.com/gravatar/4f4df97a974b6ac050755f35c621e882?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1124523", 
      "title": "\u6709\u8001\u54e5\u719f\u6089 OpenCart \u7684\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1124523", 
      "date_published": "2025-04-10T09:06:02+00:00", 
      "content_html": "\u76ee\u524d\u6211\u4eec\u6709\u4e2a\u7528 OpenCart \u5f00\u53d1\u7684\u7f51\u7ad9\uff0c\u76ee\u524d\u7f51\u7ad9\u4e00\u76f4\u6709\u70b9\u95ee\u9898\uff0c\u9700\u8981\u4e2a\u4e86\u89e3 OpenCart \u7684\u6280\u672f\u6765\u4fee\u590d\u4e0b\u3002\u6709\u507f\u3002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/akagishigeru", 
        "name": "akagishigeru", 
        "avatar": "https://cdn.v2ex.com/avatar/e5be/294f/320577_large.png?m=1758709048"
      }, 
      "url": "https://www.v2ex.com/t/1123931", 
      "date_modified": "2025-04-08T05:38:08+00:00", 
      "content_html": "<p>\u5728\u505a\u7684\u4e00\u4e9b\u9879\u76ee\u7684 <code>package</code> \u90fd\u662f\u7528\u79c1\u6709\u5305\u5206\u53d1\u7684\uff0c\u7528\u6237\u4f7f\u7528\u79c1\u6709\u5305\u7684\u6388\u6743\u7801\u83b7\u53d6\u66f4\u65b0\u5305\u3002\u5f53\u7136\u8fd9\u4e2a\u9879\u76ee\u7684\u4e3b\u8981\u529f\u80fd\u662f\u5206\u53d1\u5305\uff0c\u800c\u4e0d\u662f\u4fdd\u62a4\u5305\u7684\u6e90\u4ee3\u7801\u3002</p>\n<p>\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u5173\u6ce8\u4e0b \ud83d\ude02 <a href=\"https://github.com/JaguarJack/packvault\" rel=\"nofollow\">Packvault \u5f00\u6e90\u5730\u5740</a></p>\n<p>\u505a\u4e00\u4e9b <code>PHP</code> \u9879\u76ee \u7136\u540e\u7ed9\u7528\u6237\u505a\u5206\u53d1\u8fd8\u662f\u633a\u6709\u7528\u7684</p>\n", 
      "date_published": "2025-04-08T05:37:40+00:00", 
      "title": "\u5f00\u6e90 PHP Composer \u79c1\u6709 package \u7ba1\u7406\u5e73\u53f0", 
      "id": "https://www.v2ex.com/t/1123931"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/flowerwow0316", 
        "name": "flowerwow0316", 
        "avatar": "https://cdn.v2ex.com/gravatar/3fdbd28306d7468e08b5a91076a20255?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1123546", 
      "title": "\u63a8\u8350\u4e2a\u597d\u7528\u7684\u96c6\u6210\u73af\u5883", 
      "id": "https://www.v2ex.com/t/1123546", 
      "date_published": "2025-04-06T09:51:52+00:00", 
      "content_html": "<p><a href=\"https://flyenv.com/\" rel=\"nofollow\">https://flyenv.com/</a>\n\u7b2c\u4e00\u6b21\u89c1\u8fd9\u4e48\u53fc\u7684\uff0c\u80fd\u4ec0\u4e48\u90fd\u96c6\u6210\u5728\u4e00\u8d77\u7684\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/hukei", 
        "name": "hukei", 
        "avatar": "https://cdn.v2ex.com/avatar/31c0/294c/615622_large.png?m=1770367727"
      }, 
      "url": "https://www.v2ex.com/t/1122589", 
      "title": "phpinfo(); logo \u53d8\u6210\u4e86\u7eff\u8272\u7684\u5927\u8c61", 
      "id": "https://www.v2ex.com/t/1122589", 
      "date_published": "2025-04-01T07:34:00+00:00", 
      "content_html": "PHP \u5bf9\u611a\u4eba\u8282\u7684\u73a9\u7b11 -_-"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/tlerbao", 
        "name": "tlerbao", 
        "avatar": "https://cdn.v2ex.com/avatar/9deb/c5d9/421999_large.png?m=1745547699"
      }, 
      "url": "https://www.v2ex.com/t/1117090", 
      "date_modified": "2025-03-10T00:27:41+00:00", 
      "content_html": "\u4e00\u4e2a\u540e\u7aef\u590d\u5236\u6765\u590d\u5236\u53bb\u7684\uff0c\u589e\u5f3a\u4e86\uff0c\u4fee\u590d\u4e86\uff0c\u6ca1\u628a\u53d1\u5feb\u901f\u540c\u6b65 N \u4e2a\u9879\u76ee<br /><br />\u6709\u524d\u7aef monorepo \u7684\u6982\u5ff5\u5417\u54c8\u54c8", 
      "date_published": "2025-03-09T13:45:55+00:00", 
      "title": "PHP \u9879\u76ee\u6709\u7c7b\u4f3c\u524d\u7aef monorepo \u7684\u6982\u5ff5\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/1117090"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/fan88", 
        "name": "fan88", 
        "avatar": "https://cdn.v2ex.com/avatar/b45b/9532/356765_large.png?m=1746960603"
      }, 
      "url": "https://www.v2ex.com/t/1116197", 
      "title": "\u60f3\u7528 PHP \u505a\u5fae\u670d\u52a1\u5f00\u53d1\uff0c\u6709\u507f\u6c42\u6307\u5bfc", 
      "id": "https://www.v2ex.com/t/1116197", 
      "date_published": "2025-03-05T15:52:24+00:00", 
      "content_html": "<p>\u76ee\u524d\u6280\u672f\u6808\u662f thinkphp8 + swoole \uff0c\u73b0\u5728\u5ba2\u6237\u6709\u8981\u6c42\u4e0d\u51c6\u6211\u4eec\u505a\u5355\u4f53\u5e94\u7528\uff0c\u5fc5\u987b\u8981\u505a\u5fae\u670d\u52a1\u5f00\u53d1\u3002\n\u5bf9\u5fae\u670d\u52a1\u7684\u5f00\u53d1\u6ca1\u4ec0\u4e48\u7ecf\u9a8c\uff0c\u60f3\u54a8\u8be2\u6709\u7ecf\u9a8c\u7684\u5e08\u5085\u6307\u6307\u95e8\u9053\uff0c\u6709\u507f\n\u540c\u65f6\uff0c\u6211\u4e5f\u8003\u8651\u90e8\u5206\u7684\u670d\u52a1\u8fdb\u884c\u5916\u5305\uff0c\u6b22\u8fce\u6709\u7ecf\u9a8c\u7684\u5e08\u5085\u6765\u8054\u7cfb</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/AndrewHenry", 
        "name": "AndrewHenry", 
        "avatar": "https://cdn.v2ex.com/avatar/4910/cb40/621873_large.png?m=1748669696"
      }, 
      "url": "https://www.v2ex.com/t/1112469", 
      "title": "PHP \u8bed\u8a00\u5df2\u7ecf\u8fc7\u6c14\u4e86\u5417", 
      "id": "https://www.v2ex.com/t/1112469", 
      "date_published": "2025-02-18T19:12:07+00:00", 
      "content_html": ""
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zhouyin", 
        "name": "zhouyin", 
        "avatar": "https://cdn.v2ex.com/gravatar/e450dd47c26a447dd25d9d7f95dae113?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1108309", 
      "title": "\u56fd\u5185 PHP \u5377\u738b\u662f\u9e1f\u54e5", 
      "id": "https://www.v2ex.com/t/1108309", 
      "date_published": "2025-01-30T00:30:17+00:00", 
      "content_html": "<p>\u6700\u8fd1\u5b66\u4e86 python \u539f\u751f\u534f\u7a0b async await \u4ee5\u53ca asyncio \u5e93</p>\n<p>\u56de\u5934\u91cd\u65b0\u770b\u4e86 php \u534f\u7a0b \u53d1\u73b0 php \u534f\u7a0b\u5b9e\u5728\u592a\u5783\u573e\u4e86 \u597d\u50cf\u6709\u4e2a\u5b98\u65b9\u6587\u6863 \u63d0\u4f9b\u4e86\u5927\u91cf\u793a\u4f8b \u534f\u7a0b\u4e5f\u53ef\u4ee5\u53d6\u6d88 \u4f46\u5b83\u662f\u628a\u6240\u6709 job \u653e\u5165\u4e00\u4e2a\u961f\u5217 \u53d6\u6d88\u5c31\u662f\u4ece\u961f\u5217\u5220\u9664  \u5b9e\u5728\u592a\u5783\u573e\u4e86 \u8ddf python asyncio \u6bd4\u90fd\u4e0d\u80fd\u6bd4 python asyncio \u53ef\u4ee5\u76f4\u63a5\u628a\u51fd\u6570\u521b\u5efa\u4e3a task \u7136\u540e\u8d85\u65f6\u7684\u8bdd \u5728\u4e3b\u63a7\u5236\u51fd\u6570\u91cc\u76f4\u63a5 task.cancel()</p>\n<p>php \u7684\u534f\u7a0b\u4ee3\u7801\u4e5f\u662f\u770b\u8d77\u6765\u592a\u5570\u55e6 \u4e00\u56e2\u7cdf</p>\n<p>\u8fd9\u51e0\u5e74 php \u7684\u4efd\u989d\u4e0d\u65ad\u88ab js go \u8695\u98df php \u8981\u63a8\u51fa jit \u4e3b\u8981\u4f5c\u8005\u662f\u9e1f\u54e5 \u5176\u5b9e\u9e1f\u54e5\u662f\u56fd\u5185 php \u5377\u738b \u5fc5\u987b\u8981\u7ef4\u6301\u81ea\u5df1\u7684\u751f\u5b58 \u4e0d\u65ad\u7ed9 php \u8fdb\u5316 \u4e0d\u7136 php \u88ab\u629b\u5f03\u4e86 \u88ab\u626b\u8fdb\u5386\u53f2\u5783\u573e\u5806\u4e86 \u4ed6\u7684\u65e5\u5b50\u4e5f\u8981\u4e0d\u597d\u8fc7\u4e86</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/awanganddong", 
        "name": "awanganddong", 
        "avatar": "https://cdn.v2ex.com/gravatar/e482df556a9ac0e4553da45a819ba931?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1105356", 
      "date_modified": "2025-01-15T11:25:54+00:00", 
      "content_html": "<p>\u540e\u53f0\u6709\u4e00\u4e2a\u6279\u91cf\u64cd\u4f5c\u7684\u529f\u80fd\u3002</p>\n<p>\u7528\u6237\u5ba1\u6838\u901a\u8fc7\uff0c\u7136\u540e\u7ed9\u4ed6\u7684\u9080\u8bf7\u4eba\u52a0\u4f18\u60e0\u4ef7\u3002</p>\n<pre><code>\u4f2a\u4ee3\u7801\nforeach(users as user){\n    //\u901a\u8fc7\u5ba1\u6838\uff08\u4e8b\u52a1\u4fdd\u8bc1\uff09\n    \n   // \u7ed9\u9080\u8bf7\u4eba\u52a0\u4f18\u60e0\u5377\uff08\u4e8b\u52a1\u4fdd\u8bc1\uff09\n}\n</code></pre>\n<p>\u73b0\u5728\u51fa\u73b0\u7684\u95ee\u9898\u662f\u7528\u6237\u52a0\u4f18\u60e0\u4ef7\u8fd9\u4e2a\u8fc7\u7a0b\uff0c\u5bf9\u7528\u6237\u4fe1\u606f\u66f4\u65b0\u4f18\u60e0\u5377\u603b\u6570\u5931\u8d25\u3002</p>\n<p>\u7ed9\u7528\u6237\u52a0\u4f18\u60e0\u5377\u6709 2 \u4e2a\u63d2\u5165\u64cd\u4f5c\uff0c\u4e00\u4e2a\u66f4\u65b0\u64cd\u4f5c\u3002</p>\n<p>\u521a\u624d\u8fdb\u884c\u6279\u91cf\u64cd\u4f5c\uff0c\u6267\u884c\u4e86 20 \u4e2a\u7528\u6237\uff0c\u5176\u4e2d\u51e0\u4e2a update \u64cd\u4f5c\u5931\u8d25\u3002\u6240\u4ee5\u5bf9\u8fd9\u4e2a\u95ee\u9898\u6ca1\u60f3\u660e\u767d\uff0cmysql rr \u7ea7\u522b\u3002</p>\n", 
      "date_published": "2025-01-15T11:24:45+00:00", 
      "title": "mysql update \u66f4\u65b0\u5931\u8d25\u7684\u539f\u56e0\u3002", 
      "id": "https://www.v2ex.com/t/1105356"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/hkui2012", 
        "name": "hkui2012", 
        "avatar": "https://cdn.v2ex.com/gravatar/a067974defa83fe89f116d09b37c6b89?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1101729", 
      "title": "PHP \u7a0b\u5e8f\u5458\u662f\u5f80\u8fd0\u7ef4\u8fd8\u662f\u524d\u7aef\u53d1\u5c55\u4f5c\u4e3a\u62d3\u5c55\u5462", 
      "id": "https://www.v2ex.com/t/1101729", 
      "date_published": "2025-01-01T01:57:24+00:00", 
      "content_html": "<p>php \u505a\u4e86\u4e03\u516b\u5e74\u4e86\uff0c\u4e4b\u524d\u6ca1\u5206\u79bb\u7684\u65f6\u5019\uff0cjquery \u4e00\u628a\u68ad\uff0c\u73b0\u5728\u524d\u7aef\u6280\u672f \u90fd vue,nuxt \u7b49\u524d\u540e\u7aef\u5206\u79bb\u7684\u90a3\u4e00\u5957\uff0c\u5f88\u4e45\u6ca1\u5199\u524d\u7aef\u4e86\uff0c\n\u4f1a\u70b9 go,\u516c\u53f8\u4e4b\u524d\u8f6c java,\u5199\u8fc7\u4e00\u70b9\uff0c\u540e\u6765\u516c\u53f8\u653e\u5f03\u4e86\uff0c\u53c8\u91cd\u56de php \u4e86\uff0c\u8fd0\u7ef4\u4e5f\u61c2\u4e00\u70b9</p>\n<p>\u5982\u679c\u60f3\u7ee7\u7eed\u5f85\u4e0b\u53bb\uff0c\u662f\u5b66\u524d\u7aef\u8fd8\u662f\u8fd0\u7ef4\u5462 \u6216\u8005\u5377\u5176\u5b83\uff0c\u76ee\u524d\u57fa\u672c\u7684\u8fd0\u7ef4\u4f1a\uff0ck8s \u61c2\u4e00\u4e9b</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/SEoSean", 
        "name": "SEoSean", 
        "avatar": "https://cdn.v2ex.com/gravatar/3a446a1e95f5f81b8ffd4a74c9b3ca21?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1093198", 
      "title": "\u6c42\u5927\u4f6c\u89e3\u51b3\u4e00\u4e0b\u4e00\u4e2a\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1093198", 
      "date_published": "2024-11-27T11:50:07+00:00", 
      "content_html": "<p>\u6211\u9700\u8981 \u5229\u7528 php \u6765\u83b7\u53d6\u8bbf\u95ee\u7684\u8718\u86db  \u9700\u8981\u5728\u5176\u4ed6\u9875\u9762\u8c03\u7528  \u4ee3\u7801\u5e94\u8be5\u600e\u4e48\u5199\uff1f \u6c42\u5927\u4f6c\u7ed9\u4e00\u4e2a\u53c2\u8003 \u8c22\u8c22</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/coderzhangsan", 
        "name": "coderzhangsan", 
        "avatar": "https://cdn.v2ex.com/gravatar/45c2ed6b86a63716a98aae801bcde8ce?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1092397", 
      "date_modified": "2024-11-25T06:12:14+00:00", 
      "content_html": "<p>RT</p>\n<p>\u672c\u4ee5\u4e3a\u8fd9\u4e2a\u7248\u672c\u4e4b\u540e\uff0c\u4e0b\u4e2a\u7248\u672c\u4f1a\u76f4\u5347 PHP 9.0 \uff0c\u5e26\u6765\u4e00\u4e9b\u65b0\u7684\u4e1c\u897f\uff0c\u6ca1\u60f3\u5230\u8fd8\u662f\u5c0f\u7248\u672c PHP 8.5 \uff0c\u867d\u7136 PHP \u6b63\u5728\u6ca1\u843d\uff0c\u4f46\u8fd8\u662f\u5e0c\u671b\u5979\u80fd\u591f\u8d8a\u6765\u8d8a\u5b8c\u5584\u3002</p>\n<p><a href=\"https://www.php.net/releases/8.4/zh.php\" rel=\"nofollow\">PHP 8.4 Release</a></p>\n", 
      "date_published": "2024-11-25T06:11:17+00:00", 
      "title": "[2024-11-21] PHP 8.4 Released!", 
      "id": "https://www.v2ex.com/t/1092397"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ruobingm", 
        "name": "ruobingm", 
        "avatar": "https://cdn.v2ex.com/avatar/fb43/abe2/349046_large.png?m=1724483437"
      }, 
      "url": "https://www.v2ex.com/t/1089278", 
      "title": "\u5982\u4f55\u83b7\u5f97\u6296\u97f3\u89c6\u9891\u64ad\u653e\u91cf\uff1f\u5404\u4f4d\u5927\u725b\u652f\u652f\u62db~", 
      "id": "https://www.v2ex.com/t/1089278", 
      "date_published": "2024-11-13T09:31:01+00:00", 
      "content_html": "<p>\u60f3\u95ee\u4e0b\u5404\u4f4d\u6280\u672f\u5927\u5496\uff0c\u5982\u4f55\u83b7\u5f97\u6296\u97f3\u64ad\u653e\u91cf\uff1f\n\u9996\u5148\uff0c\u6211\u901a\u8fc7\u5b98\u65b9\u901a\u9053\uff0ch5 \u5206\u4eab\u540e\u83b7\u53d6 item_id,\u7136\u540e\u8c03\u7528\u6296\u97f3\u5f00\u653e\u5e73\u53f0\u7684# \u67e5\u8be2\u7279\u5b9a\u89c6\u9891\u7684\u89c6\u9891\u6570\u636e\u63a5\u53e3\u3002\n\u8fd9\u91cc\u7b2c\u4e00\u4e2a\u5751\uff0c\u5c31\u662f\u6b64\u63a5\u53e3\u9700\u8981\u901a\u8fc7 PC \u626b\u7801\u83b7\u5f97\u7ecf\u8425\u6743\u9650\u4f5c\u7528\u57df\uff0c\u624d\u53ef\u4ee5\u8c03\u7528\u3002\u5982\u679c\u662f js \u6388\u6743\uff0c\u6216\u8005 web \u6388\u6743\u7528 h5 \u9875\u9762\u6388\u6743\uff0c\u90fd\u4e0d\u80fd\u62ff\u5230\u5e26 bind \u7684\u4f5c\u7528\u57df\u3002\u6240\u4ee5\u53ea\u80fd\u653e\u5f03\u8fd9\u4e2a\u8def\u5f84\u3002\n\u7136\u540e\u5c31\u6362\u4e86\u522b\u4e00\u4e2a\uff0c\u6296\u97f3\u5f00\u653e\u5e73\u53f0\u6570\u636e\u5f00\u653e\u670d\u52a1\uff0c\u89c6\u9891\u6570\u636e-\u201c\u83b7\u53d6\u89c6\u9891\u57fa\u7840\u6570\u636e\u201d \u8fd9\u4e2a\u63a5\u53e3\uff0c\u53ef\u4ee5\u83b7\u5f97\u5230\u64ad\u653e\u91cf\uff0c\u70b9\u8d5e\u6570\u6570\u636e\u3002\u539f\u672c\u633a\u597d\u7684\uff0c\u5c31\u8fd9\u6837\u7ed3\u675f\u3002\n\u7136\u800c\uff0c11 \u6708 5 \u53f7\uff0c\u628a h5 \u5206\u4eab\u5230\u6296\u97f3\u80fd\u529b \u56de\u6536\u4e86\u3002\n<img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://i.imgur.com/PFiu0rc.png\"/>\n\u7a81\u7136\u56de\u6536\uff0c\u6211\u53ea\u80fd\u505a\u6210\u624b\u52a8\u4e0d\u53d1\uff0c\u4e0d\u5206\u4eab\u4e86\u3002\u4f46\u662f\u8fd9\u6837\u7684\u5931\u53bb\u4e86\u83b7\u5f97\u89c6\u9891 item_id \u7684\u9014\u5f84\u3002\u6240\u4ee5\u4e0a\u9762\u89c6\u9891\u6570\u636e-\u201c\u83b7\u53d6\u89c6\u9891\u57fa\u7840\u6570\u636e\u201d \u8fd9\u4e2a\u63a5\u53e3\u5e9f\u4e86\u3002\u3002\uff08\u8fd8\u6709\u5176\u4ed6\u9014\u5f84\uff0c1 \u6708\u4efd\u56de\u6536\u4e86\uff0c1000 \u7c89\u4e1d\u4ee5\u4e0b\u7684\u6570\u636e\u4e0d\u8fd4\u56de\uff0c\u63a5\u6296\u97f3\u5f00\u653e\u5e73\u53f0\uff0c\u5fc3\u771f\u7684\u5f88\u7d2f\uff0c\u8bf4\u56de\u6536\u5c31\u56de\u6536~\u3002\uff09\n\u7136\u540e\u6211\u518d\u53bb\u901a\u8fc7\u7b2c\u4e09\u65b9\uff0ctikhub,\u8c03\u7528\u4e86\u63a5\u53e3\u80fd\u83b7\u5f97\uff0c\u4f46\u662f\u4e0d\u77e5\u9053\u4e3a\u4ec0\u4e48\uff0c\u5728\u672c\u5730\u8c03\u7528\u53ef\u4ee5\uff0c\u5230\u670d\u52a1\u5668\u5c31\u4e0d\u884c\u3002\u670d\u52a1\u5668\u8c03\u7528 20 \u591a\u5206\u949f\u5c31\u6210\u529f 1 2 \u6b21\u3002\u95ee\u4e86\u90a3\u8fb9\u5ba2\u670d\uff0c\u8bf4\u4e5f\u6709\u817e\u8baf\u4e91\u3001\u963f\u91cc\u4e91\u670d\u52a1\u5668\u7684\u5ba2\u6237\u51fa\u73b0\u8fd9\u6837\u7684\u95ee\u9898\uff0c\u8ba9\u4e70\u53f0\u7f8e\u56fd\u7684\u670d\u52a1\u5668\u3002\u3002\u3002\u3002\u6211\u4e0d\u53ef\u80fd\u4e70\u7f8e\u56fd\u7684\uff0c\u6211\u6ca1\u8fd9\u4e2a\u9884\u7b97\uff0c\u3002\u3002\n\u6240\u4ee5\u53c8\u65ad\u6389\u4e86\u3002\u3002\u5404\u4f4d\u5927\u795e\u6709\u6ca1\u5565\u6e20\u9053\u80fd\u83b7\u5f97\u6307\u5b9a\u89c6\u9891\u64ad\u653e\u7b49\u6570\u636e\uff0c\u4ed8\u8d39\u7684\u90fd ok \uff0c\u522b\u592a\u8d35\u7684\u3002\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/yanwushu7", 
        "name": "yanwushu7", 
        "avatar": "https://cdn.v2ex.com/avatar/61d7/1a78/204056_large.png?m=1730706691"
      }, 
      "url": "https://www.v2ex.com/t/1086502", 
      "title": "\u5982\u4f55\u4f18\u96c5\u5730\u5207\u6362 composer \u955c\u50cf", 
      "id": "https://www.v2ex.com/t/1086502", 
      "date_published": "2024-11-04T07:55:26+00:00", 
      "content_html": "<p>\u603b\u6240\u5468\u77e5\uff0c\u4f7f\u7528 composer \u7684\u65f6\u5019\uff0c\u5207\u6362\u955c\u50cf\u662f\u4e00\u4e2a\u521a\u9700\u3002\u4f46\u662f\u64cd\u4f5c\u9891\u7387\u8bf4\u9ad8\u4e0d\u9ad8\uff0c\u8bf4\u4f4e\u4e5f\u4e0d\u4f4e\uff0c\u5f80\u5f80\u9700\u8981\u5207\u6362\u955c\u50cf\u7684\u65f6\u5019\u504f\u504f\u8bb0\u4e0d\u4f4f\u547d\u4ee4\u3002\u8fd9\u65f6\uff0c\u6211\u90fd\u4f1a\u5230\u7f51\u4e0a\u641c\u7d22\u5207\u6362\u955c\u50cf\u7684\u547d\u4ee4\uff0c\u4ee5\u53ca\u6709\u54ea\u4e9b\u955c\u50cf\u7ad9\u70b9\u53ef\u7528\u3002</p>\n<p>\u5728 Xserver \u4e2d\u4f18\u96c5\u5730\u5b9e\u73b0\u4e86\u8fd9\u4e2a\u529f\u80fd\u3002\u53ea\u9700\u8981\u9f20\u6807\u70b9\u51fb\u4e00\u4e0b\u5373\u53ef\u5feb\u901f\u5207\u6362\u955c\u50cf\uff0c\u5373\u65f6\u751f\u6548\u3002</p>\n<p>Xserver \u5185\u7f6e\u4e86\u963f\u91cc\u4e91\u3001\u534e\u4e3a\u4e91\u3001\u817e\u8baf\u4e91\u548c\u9ed8\u8ba4\u955c\u50cf\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u955c\u50cf\u4e4b\u95f4\u968f\u610f\u5feb\u901f\u5207\u6362\u3002</p>\n<p><a href=\"https://pic1.zhimg.com/v2-02ac961a837c576efdb53573cf66bbaa_b.jpg\" rel=\"nofollow\">xserver</a></p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/cbasil", 
        "name": "cbasil", 
        "avatar": "https://cdn.v2ex.com/gravatar/4e8b717661a908f321138203829e6e4b?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1085268", 
      "title": "\u4e0e\u94f6\u884c\u5bf9\u63a5 sm4 \u56fd\u5bc6\u7b97\u6cd5", 
      "id": "https://www.v2ex.com/t/1085268", 
      "date_published": "2024-10-31T03:51:14+00:00", 
      "content_html": "\u6700\u8fd1\u8ddf\u94f6\u884c\u5bf9\u63a5 sm4 \u56fd\u5bc6\u7b97\u6cd5\uff0c\u641e\u4e86\u597d\u4e45\u624d\u5bf9\u63a5\u597d\uff0c\u6211\u5927\u6982\u8bb2\u4e00\u4e0b\u5f00\u53d1\u4e2d\u9047\u5230\u7684\u5751\u3002<br />php \u76f8\u5173\u56fd\u5bc6\u7b97\u6cd5\u7684\u6559\u7a0b\u5f88\u5c11\uff0c\u627e\u4e86\u597d\u4e45\u624d\u627e\u5230 github \u4e0a\u7684\u5305[<a target=\"_blank\" href=\"https://github.com/lizhichao/sm\" rel=\"nofollow noopener\">https://github.com/lizhichao/sm</a>]( <a target=\"_blank\" href=\"https://github.com/lizhichao/sm\" rel=\"nofollow noopener\">https://github.com/lizhichao/sm</a>) <br />\u914d\u7f6e\u597d\u540e\uff0c\u4e00\u8fd0\u884c\u5c31\u62a5\u9519\u79d8\u94a5\u957f\u5ea6\u4e3a 16 \u4f4d\u3002\u8ddf\u5bf9\u65b9\u6c9f\u901a\u540e\u624d\u77e5\u9053\u4ed6\u4eec\u7ed9\u7684\u662f 16 \u8fdb\u5236\u7684 32 \u4f4d\u7684 key,\u5728 php \u4e2d\u9700\u8981\u7528 hex2bin \u8f6c\u6210 16 \u4f4d\u3002<br />\u5982\u679c\u5bf9\u65b9\u7ed9\u7684\u52a0\u5bc6\u6a21\u5f0f\u662f sm4-cbc,\u8fd8\u9700\u8981\u914d\u7f6e iv \u3002\u9ed8\u8ba4 iv \u7528 hex2bin('00000000000000000000000000000000')\u751f\u6210\u3002\u4e0d\u7136\u89e3\u5bc6\u540e\u7684\u5b57\u7b26\u4e32\u524d\u540e\u4f1a\u6709\u4e71\u7801\u3002\u586b\u5145\u65b9\u6cd5\u4e00\u822c\u5e38\u7528 pkcs5 \u548c pkcs7 \u3002\u8fd9\u4e8c\u79cd\u586b\u5145\u65b9\u5f0f\u6982\u5ff5\u4e0a\u6ca1\u6709\u4ec0\u4e48\u533a\u522b\uff0c\u53ea\u662f pkcs5 \u5728 blockSize \u4e0a\u56fa\u5b9a\u4e3a 8 bytes,\u5373\u6570\u636e\u59cb\u7ec8\u4f1a\u88ab\u5207\u5272\u6210 8 \u4e2a\u5b57\u8282\u7684\u6570\u636e\u5757\uff0c\u7136\u540e\u8ba1\u7b97\u9700\u8981\u586b\u5145\u7684\u957f\u5ea6.<br />\u52a0\u5bc6\u540e\u7684\u5b57\u7b26\u7f16\u7801\u4e5f\u6709 hex \u548c base64 \u533a\u5206\u3002<br /><br />\u5982\u679c openssl \u7248\u672c\u5927\u4e8e 1.1.1 \uff0c\u5c31\u53ef\u4ee5\u7528 openssl_decrypt($data, \"sm4\", $key, $options=OPENSSL_RAW_DATA,$iv)\u6765\u89e3\u5bc6\u3002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Yesr00", 
        "name": "Yesr00", 
        "avatar": "https://cdn.v2ex.com/gravatar/c07b11f7b2e957d9c359a7a853a8e4a1?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1084412", 
      "title": "Laravel \u4e8c\u624b\u9879\u76ee\uff0c\u8bed\u8a00\u5207\u6362\u95ee\u9898\uff0c\u6c42\u89e3", 
      "id": "https://www.v2ex.com/t/1084412", 
      "date_published": "2024-10-28T12:41:30+00:00", 
      "content_html": "<p>RT,\u521b\u5efa\u4e86\u4e00\u4e2a SetLang \u4e2d\u95f4\u4ef6\uff0c \u4ee3\u7801\u5982\u4e0b\uff1a</p>\n<p>if($request-&gt;input('lang')){\napp()-&gt;setLocale($request-&gt;input('lang'));\n}</p>\n<p>return $next($request);</p>\n<p>\u9996\u6b21\u8bbe\u7f6e\u751f\u6548\uff0c\u5207\u6362\u9875\u9762\u4e0d\u5e26'lang'\u53c2\u7684\u65f6\u5019\u5728\u63a7\u5236\u5668\u91cc\u7528 app()-&gt;getLocale()\u5c31\u8fd8\u662f\u53ea\u80fd\u62ff\u5230\u9ed8\u8ba4\u8bed\u8a00\u3002\u4f7f\u7528 session \u4e5f\u662f\u4e00\u6837\u3002\u68c0\u67e5\u4e86\u4e2d\u95f4\u4ef6\u7684\u987a\u5e8f\uff0c\u5e94\u8be5\u662f\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4e5f\u6ca1\u6709\u5176\u4ed6\u7684\u5730\u65b9\u6709\u8bbe\u7f6e\u8bed\u8a00\u64cd\u4f5c\u3002\u6c42 debug \u601d\u8def</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/yxzblue", 
        "name": "yxzblue", 
        "avatar": "https://cdn.v2ex.com/avatar/7f13/9acf/23511_large.png?m=1711437097"
      }, 
      "url": "https://www.v2ex.com/t/1081563", 
      "date_modified": "2024-10-18T08:36:41+00:00", 
      "content_html": "<p>1 \u3001<a href=\"http://106.15.186.69:8061/\" rel=\"nofollow\">http://106.15.186.69:8061/</a></p>\n<p>2 \u3001<a href=\"http://106.15.186.69:8097/\" rel=\"nofollow\">http://106.15.186.69:8097/</a></p>\n", 
      "date_published": "2024-10-18T08:36:16+00:00", 
      "title": "\u4e24\u9053 PHP \u9898\u76ee\uff0c\u90fd\u662f\u6c42 flag \u503c", 
      "id": "https://www.v2ex.com/t/1081563"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/RunningRabbit", 
        "name": "RunningRabbit", 
        "avatar": "https://cdn.v2ex.com/gravatar/323356221814cff57ac4336223d44c0d?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1074541", 
      "title": "\u5e2e\u5fd9\u63a8\u8350\u4e00\u4e2a\u5f00\u6e90\u8bba\u575b\u6e90\u7801\uff1f", 
      "id": "https://www.v2ex.com/t/1074541", 
      "date_published": "2024-09-21T01:28:13+00:00", 
      "content_html": "<p>\u6700\u8fd1\u6253\u7b97\u642d\u5efa\u4e00\u4e2a\u8bba\u575b\uff0c\u529f\u80fd\u53ef\u4ee5\u7b80\u5355\u70b9\uff0c\u754c\u9762\u5dee\u4e0d\u591a\u7684\u8bba\u575b\u7c7b\u6e90\u7801\u5e2e\u5fd9\u63a8\u8350\u4e0b\uff0c\u8c22\u8c22</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/akagishigeru", 
        "name": "akagishigeru", 
        "avatar": "https://cdn.v2ex.com/avatar/e5be/294f/320577_large.png?m=1758709048"
      }, 
      "url": "https://www.v2ex.com/t/1070582", 
      "title": "Laravel \u5b8c\u6210\u4e86 A \u8f6e\u878d\u8d44\ud83c\udf89", 
      "id": "https://www.v2ex.com/t/1070582", 
      "date_published": "2024-09-05T15:02:27+00:00", 
      "content_html": "<p>@<a href=\"/member/Taylor\">Taylor</a></p>\n<pre><code>I'm excited to announce that Laravel has raised a $57M Series A in partnership with Accel.\n\nI believe that Laravel is the most productive way to build full-stack web applications, and Laravel Cloud will be the platform for shipping those applications that this community deserves.\n</code></pre>\n<p>\u9996\u8f6e\u878d\u8d44 5700 \u4e07\u7f8e\u91d1\u3002</p>\n<p>\u53ef\u4ee5\u7528\u4e0a\u514d\u8d39\u7684 Laravel Cloud \u4ea7\u54c1\u54af</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/pixcai", 
        "name": "pixcai", 
        "avatar": "https://cdn.v2ex.com/avatar/b773/6a8b/328678_large.png?m=1740145107"
      }, 
      "url": "https://www.v2ex.com/t/1069110", 
      "date_modified": "2024-08-30T10:54:54+00:00", 
      "content_html": "<p>\u4e0d\u5f97\u4e0d\u8bf4<code>PHP</code>\u7684<code>Laravel</code>\u6846\u67b6\uff08\u6216\u8005<code>ThinkPHP</code>\uff09\u662f\u771f\u7684\u597d\u7528\u554a\uff0c\u5f88\u591a\u529f\u80fd\u5f00\u7bb1\u5373\u7528\uff0c\u4e3a\u4ec0\u4e48\u73b0\u5728\u7684<code>Web</code>\u6846\u67b6\u53cd\u800c\u4e0d\u8fd9\u4e48\u505a\u4e86\u5462\uff1f</p>\n<p>\u6bd4\u5982<code>Go</code>\u7684<code>Gin</code>\uff0c<code>Node</code>\u7684<code>express</code>\uff0c<code>Python</code>\u7684<code>Flask</code>\uff0c\u90fd\u662f\u5b9a\u4e49\u8def\u7531\u3001\u8fd4\u56de<code>JSON</code>\u3001\u6a21\u677f\u6e32\u67d3\u3001\u9759\u6001\u6587\u4ef6\u670d\u52a1\u8fd9\u51e0\u4e2a\u57fa\u7840\u529f\u80fd\uff0c\u60f3\u8981\u522b\u7684\u9700\u6c42\u8fd8\u5f97\u81ea\u5df1\u88c5\uff0c\u81ea\u5df1\u88c5\u6570\u636e\u5e93\u9a71\u52a8\u3001\u641e\u6ce8\u518c\u767b\u5f55\u3001\u641e\u90ae\u4ef6\u53d1\u9001\u4ec0\u4e48\u7684\uff0c\u66f4\u522b\u8bf4\u7ed3\u5408\u524d\u7aef\u7684<code>Vue</code>\u3001<code>React</code>\u3001<code>Tailwind CSS</code>\u8fd9\u4e9b\u4e86\uff0c\u4e0d\u4f1a\u524d\u7aef\u7684\u641e\u914d\u7f6e\u90fd\u8981\u641e\u534a\u5929\u3002</p>\n<p>\u53cd\u89c2<code>Laravel</code>\u7cfb\u5217\uff0c\u4e0a\u9762\u7684\u529f\u80fd\u8981\u4e48\u81ea\u5e26\uff0c\u8981\u4e48\u88c5\u4e2a\u5e93\u8fd0\u884c\u4e0b\u547d\u4ee4\u5c31\u81ea\u52a8\u5168\u914d\u7f6e\u597d\u4e86\uff0c\u7b80\u76f4\u4e0d\u8981\u592a\u65b9\u4fbf\uff01</p>\n<p>\u72e0\u72e0\u5730\u88ab\u60ca\u8273\u5230\u4e86\uff01</p>\n", 
      "date_published": "2024-08-30T09:45:00+00:00", 
      "title": "PHP \u867d\u7136\u6ca1\u843d\u4e86\uff0c\u4f46\u662f PHP \u7684\u4e1c\u897f\u662f\u771f\u7684\u597d\u7528", 
      "id": "https://www.v2ex.com/t/1069110"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/est", 
        "name": "est", 
        "avatar": "https://cdn.v2ex.com/avatar/c3e8/78e2/362_large.png?m=1774152156"
      }, 
      "url": "https://www.v2ex.com/t/1068087", 
      "date_modified": "2024-08-27T03:26:15+00:00", 
      "content_html": "<p>\u6709\u8fd9\u6837\u4e00\u4e2a serverless \u5e73\u53f0\uff1a</p>\n<ol>\n<li>\u5b83\u652f\u6301\u8d85\u7ea7\u6d41\u884c\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u8bed\u6cd5\u7b80\u5355\uff0c\u529f\u80fd\u4e30\u5bcc\uff0c10 \u5206\u949f\u5c31\u80fd\u5b66\u4f1a</li>\n<li>\u901a\u8fc7 FTP \u4e4b\u7c7b\u7684\u6807\u51c6\u5de5\u5177\u90e8\u7f72\uff0c\u800c\u4e0d\u662f\u8111\u6b8b\u7684\u547d\u4ee4\u884c</li>\n<li>\u4e0d\u7528\u7ba1\u7406\u9ebb\u70e6\u7684\u670d\u52a1\u5668\u3002\u57fa\u4e8e\u975e\u5e38\u6210\u719f\u7684 scaling \u65b9\u6848\u3002\u4e5f\u6709\u5927\u91cf\u7f51\u7ad9\u9a8c\u8bc1\u8fc7</li>\n<li>\u867d\u7136\u4e0d\u662f docker \uff0c\u4f46\u662f <code>vhost</code> \u591f\u7528\u4e86\u3002\u800c\u4e14\u8981\u5bb9\u5668\u5316 <code>vhost</code> \u4e5f\u5f88\u5bb9\u6613</li>\n<li>\u8ba9\u4eba\u68a6\u5bd0\u4ee5\u6c42\u7684\u201c\u70ed\u66f4\u65b0\u201d\u6280\u672f</li>\n<li>\u8d85\u7ea7\u4fbf\u5b9c\u7684\u6708\u79df</li>\n<li>\u4e0d\u4f1a\u540a\u6b7b\u5728\u4e00\u9897\u6811\uff08 vendor lock-in \uff09\u4e0a\u3002\u5168\u7403\u904d\u5730\u7684\u5382\u5546\u90fd\u652f\u6301</li>\n</ol>\n<p>\u8fd9\u4e48\u597d\u7684 serverless \u662f\u54ea\u5bb6\uff1f\u8bf7\u770b\u672c\u8d34\u6240\u5c5e\u8282\u70b9 \ud83d\ude06\ud83d\ude06\ud83d\ude06\ud83d\ude06\ud83d\ude06</p>\n<p>\u540c\u6b65\u53d1\u8868\u4e8e<a href=\"https://blog.est.im/2024/stdout-17\" rel=\"nofollow\">\u6211\u7684 blog</a></p>\n", 
      "date_published": "2024-08-27T03:25:31+00:00", 
      "title": "\u4e16\u754c\u4e0a\u6700\u597d\u7684 serverless \u5e73\u53f0\uff01", 
      "id": "https://www.v2ex.com/t/1068087"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/shendaowu", 
        "name": "shendaowu", 
        "avatar": "https://cdn.v2ex.com/avatar/6fa4/0f0c/233858_large.png?m=1771487434"
      }, 
      "url": "https://www.v2ex.com/t/1064947", 
      "title": "imgur \u662f\u600e\u4e48\u505a\u5230\u4e00\u4e2a\u94fe\u63a5\u65b0\u7a97\u53e3\u6253\u5f00 302\uff0c\u4f46\u662f\u8fd8\u80fd\u4f5c\u4e3a\u56fe\u7247\u663e\u793a\u7684\uff1f", 
      "id": "https://www.v2ex.com/t/1064947", 
      "date_published": "2024-08-14T07:49:40+00:00", 
      "content_html": "\u6bd4\u5982\u8fd9\u4e2a\uff1a<br /><br /><a target=\"_blank\" href=\"https://i.imgur.com/kU6LFj0.jpeg\" rel=\"nofollow noopener\" target=\"_blank\"><img src=\"https://i.imgur.com/kU6LFj0.jpeg\" class=\"embedded_image\" rel=\"noreferrer\"></a><br /><br /><br />\u70b9\u51fb\u56fe\u7247\u4f1a\u5728\u65b0\u7a97\u53e3\u6253\u5f00\uff0c\u7136\u540e\u4f1a 302 \u5230\u7f51\u9875\u3002<br /><br />\u56fe\u8fd9\u91cc\u770b\u5230\u7684\uff1a <a target=\"_blank\" href=\"https://www.v2ex.com/t/1064815\" rel=\"nofollow noopener\">https://www.v2ex.com/t/1064815</a> \u3002<br /><br />\u6ca1\u627e\u5230\u5408\u9002\u548c\u8282\u70b9\u3002\u8c37\u6b4c\u548c AI \u90fd\u4e0d\u6ee1\u610f\u3002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/heguangyu5", 
        "name": "heguangyu5", 
        "avatar": "https://cdn.v2ex.com/avatar/b740/e481/159374_large.png?m=1579242902"
      }, 
      "url": "https://www.v2ex.com/t/1064519", 
      "title": "PHP \u7f16\u8bd1\u5668 BPC \u7f16\u8bd1 ThinkPHP8 + PHPUnit \u6d4b\u8bd5 \u7684\u89c6\u9891\u6765\u4e86", 
      "id": "https://www.v2ex.com/t/1064519", 
      "date_published": "2024-08-13T01:22:19+00:00", 
      "content_html": "<p>\u89c6\u9891\u6709\u70b9\u957f,1.5 \u500d\u901f\u770b\u4e5f\u6ca1\u95ee\u9898.</p>\n<p>\u4ece\u4e00\u4e2a\u65b0\u88c5\u597d\u7684 Ubuntu 24.04 Desktop \u7684\u865a\u62df\u673a\u5f00\u59cb:</p>\n<ol>\n<li>\n<p>composer + PHP \u8fd0\u884c\u9879\u76ee\u6ca1\u95ee\u9898</p>\n</li>\n<li>\n<p>\u53bb\u6389 composer \u8fd0\u884c\u9879\u76ee\u6ca1\u95ee\u9898</p>\n</li>\n<li>\n<p>PHP \u8dd1\u901a PHPUnit \u6d4b\u8bd5</p>\n</li>\n<li>\n<p>BPC \u7f16\u8bd1\u8dd1\u901a PHPUnit \u6d4b\u8bd5</p>\n</li>\n<li>\n<p>PHP \u73af\u5883\u4e0b\u9879\u76ee\u5404\u9879\u529f\u80fd\u6d4b\u8bd5\u6ca1\u95ee\u9898</p>\n</li>\n<li>\n<p>BPC \u7f16\u8bd1\u8fd0\u884c\u8d77\u6765\u9879\u76ee\u5404\u9879\u529f\u80fd\u6d4b\u8bd5\u6ca1\u95ee\u9898</p>\n</li>\n</ol>\n<p>[ PHP \u7f16\u8bd1\u5668 BPC \u7f16\u8bd1 ThinkPHP8 + PHPUnit \u6d4b\u8bd5]  <a href=\"https://www.bilibili.com/video/BV1Laece6Epr/?share_source=copy_web&amp;vd_source=fb7701afa4e3c4faaffabbe49ab11ac2\" rel=\"nofollow\">https://www.bilibili.com/video/BV1Laece6Epr/?share_source=copy_web&amp;vd_source=fb7701afa4e3c4faaffabbe49ab11ac2</a></p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/heguangyu5", 
        "name": "heguangyu5", 
        "avatar": "https://cdn.v2ex.com/avatar/b740/e481/159374_large.png?m=1579242902"
      }, 
      "url": "https://www.v2ex.com/t/1064349", 
      "title": "PHP \u7f16\u8bd1\u5668 BPC 7.3 \u53d1\u5e03,\u6210\u529f\u7f16\u8bd1 ThinkPHP8", 
      "id": "https://www.v2ex.com/t/1064349", 
      "date_published": "2024-08-12T06:14:04+00:00", 
      "content_html": "<p>BPC \u662f\u4e00\u4e2a PHP Native Compiler,\u53ef\u4ee5\u5c06 PHP \u6e90\u7801\u6700\u7ec8\u8f6c\u8bd1\u6210 C \u8bed\u8a00,\u7136\u540e\u7f16\u8bd1\u6210\u52a8\u6001\u94fe\u63a5\u5e93\u6216\u53ef\u6267\u884c\u7a0b\u5e8f.</p>\n<p>BPC \u8fd8\u5185\u7f6e\u8f6f\u4ef6\u6388\u6743\u673a\u5236,\u6700\u7ec8\u53ef\u5b9e\u73b0\u6e90\u7801\u4fdd\u62a4\u3001\u8f6f\u4ef6\u6388\u6743\u3001\u4e8c\u8fdb\u5236\u6253\u5305\u4e09\u5408\u4e00!</p>\n<p>\u5f7b\u5e95\u89e3\u51b3 PHP \u9879\u76ee\u7684\u4ea4\u4ed8\u95ee\u9898.</p>\n<p><img alt=\"How BPC Works\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://bpc.dev/bpc.svg\"/></p>\n<ol>\n<li><a href=\"https://bpc.dev/\" rel=\"nofollow\">\u5b98\u7f51 bpc.dev</a></li>\n<li><a href=\"https://github.com/bob-php-compiler/bpc-release/wiki/01_Install\" rel=\"nofollow\">\u5b89\u88c5\u4f7f\u7528\u6587\u6863</a></li>\n</ol>\n<p>\u5199\u5728\u524d\u9762: </p>\n<ol>\n<li>bpc \u4e0d\u662f\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee,\u9879\u76ee\u5386\u53f2\u53ef\u4ee5\u7ffb\u770b\u4e4b\u524d\u7684\u6587\u7ae0\u548c\u5e16\u5b50.</li>\n<li>ThinkPHP8 \u7684\u7f16\u8bd1\u53ea\u662f\u4e00\u4e2a\u53ef\u884c\u6027\u9a8c\u8bc1,\u8bf7\u52ff\u7528\u4e8e\u751f\u4ea7\u73af\u5883.</li>\n</ol>\n<h2>1. \u4e86\u89e3 ThinkPHP</h2>\n<p>\u4e4b\u524d\u5c31\u6709\u7f51\u53cb\u63d0\u8fc7\u80fd\u4e0d\u80fd\u7f16\u8bd1 ThinkPHP,\u6211\u4e5f\u7ffb\u770b\u8fc7\u51e0\u6b21 ThinkPHP \u7684\u4ee3\u7801,\u867d\u7136 ThinkPHP \u5e26\u6709\u6d4b\u8bd5\u7528\u4f8b,\u4f46\u662f\u4e00\u773c\u770b\u53bb\u5f88\u5c11,\u4e0d\u6e05\u695a\u80fd\u8986\u76d6\u5230\u591a\u5c11\u529f\u80fd\u70b9.</p>\n<p>\u518d\u52a0\u4e0a\u6211\u81ea\u5df1\u4ece\u6ca1\u5199\u8fc7 ThinkPHP \u7684\u9879\u76ee,\u5bf9 ThinkPHP \u5f88\u964c\u751f,\u6240\u4ee5\u4e00\u76f4\u6ca1\u6709\u5c1d\u8bd5\u7f16\u8bd1.</p>\n<p>\u7531\u4e8e php \u7684\u52a8\u6001\u6027\u548c bpc \u4e0e php \u7684\u9ad8\u517c\u5bb9\u7279\u70b9,bpc \u7f16\u8bd1\u901a\u8fc7\u4e0d\u4ee3\u8868\u5c31\u6ca1\u95ee\u9898\u4e86,\u5982\u679c\u6709\u6d4b\u8bd5\u7528\u4f8b\u4fdd\u969c\u7684\u8bdd,\u901a\u8fc7\u8fd0\u884c\u6d4b\u8bd5\u7528\u4f8b\u53ef\u4ee5\u9a8c\u8bc1\u7f16\u8bd1\u540e\u7684\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u662f\u5426\u4e0e\u539f\u6765\u7684 php \u7b49\u540c.</p>\n<h2>2. \u8fc1\u79fb OurBlog \u5230 ThinkPHP</h2>\n<p>\u4e4b\u524d\u5199\u7684\u4e00\u672c\u5173\u4e8e PHPUnit \u7684\u7535\u5b50\u4e66\u300a PHPUnit in Action --- The Easy Way \u300b\u91cc\u6709\u4e00\u4e2a\u535a\u5ba2\u9879\u76ee <a href=\"https://github.com/heguangyu5/PHPUnit-in-Action-Code\" rel=\"nofollow\">OurBlog</a>,\u867d\u7136\u529f\u80fd\u5f88\u7b80\u5355,\u4f46\u57fa\u672c\u7684 CURD \u90fd\u6d89\u53ca\u5230\u4e86,\u6d4b\u8bd5\u4e5f\u975e\u5e38\u5b8c\u6574.</p>\n<p>\u4e8e\u662f\u5c31\u60f3\u7740\u628a OurBlog \u8fc1\u79fb\u5230 ThinkPHP \u8bd5\u4e00\u4e0b,\u7531\u4e8e\u6709\u6d4b\u8bd5\u4fdd\u969c,\u8fd9\u4e2a\u8fc1\u79fb\u5e94\u8be5\u6bd4\u8f83\u597d\u505a.</p>\n<p>\u4e00\u756a\u6298\u817e\u4e4b\u540e,\u8fc1\u79fb\u6210\u529f\u4e86! \u6e90\u7801\u89c1: <a href=\"https://github.com/heguangyu5/bpc-thinkphp8-ourblog\" rel=\"nofollow\">bpc-thinkphp8-ourblog</a></p>\n<h2>3. BPC \u7f16\u8bd1: \u7406\u6e05\u4f9d\u8d56</h2>\n<p>\u5728\u4f7f\u7528 composer \u521b\u5efa ThinkPHP \u9879\u76ee\u65f6,\u53ef\u4ee5\u770b\u5230\u4e00\u4e2a ThinkPHP8 \u9879\u76ee\u6709\u4ee5\u4e0b\u4f9d\u8d56:</p>\n<pre><code>league/mime-type-detection (1.15.0)\nleague/flysystem (2.5.0)\n\npsr/container (2.0.2)\npsr/http-message (1.1)\npsr/simple-cache (3.0.0)\npsr/log (3.0.0)\n\nsymfony/polyfill-mbstring (v1.29.0)\nsymfony/var-dumper (v7.1.1)\n\ntopthink/think-helper (v3.1.6)\ntopthink/think-orm (v3.0.20)\ntopthink/framework (v8.0.3)\ntopthink/think-filesystem (v2.0.2)\ntopthink/think-trace (v1.6)\n</code></pre>\n<p>\u8fdb\u4e00\u6b65\u5730,\u8dd1\u901a OurBlog \u6d4b\u8bd5\u7528\u4f8b, \u53ea\u9700\u8981\u641e\u5b9a 3 \u4e2a\u4f9d\u8d56\u5c31\u53ef\u4ee5\u4e86:</p>\n<ol>\n<li>psr/simple-cache (3.0.0)</li>\n<li>topthink/think-helper (v3.1.6)</li>\n<li>topthink/think-orm (v3.0.20)</li>\n</ol>\n<p>\u6700\u540e,ourblog \u7684\u524d\u7aef\u754c\u9762\u80fd\u6b63\u5e38\u8fd0\u884c,\u4e0d\u9700\u8981\u641e\u5b9a\u6240\u6709\u4f9d\u8d56,\u53ea\u9700\u8981\u641e\u5b9a\u4e0b\u8fb9 4 \u4e2a\u5c31\u884c\u4e86:</p>\n<ol>\n<li>psr/container (2.0.2)</li>\n<li>psr/http-message (1.1)</li>\n<li>psr/log (3.0.0)</li>\n<li>topthink/framework (v8.0.3)</li>\n</ol>\n<p>\u7531\u4e8e topthink/framework \u548c think-orm \u91cc\u90fd\u5305\u542b\u4e86 <code>think\\Facade</code> \u548c <code>think\\Exception</code> , \u9700\u8981\u628a <code>think-orm/stubs</code> \u72ec\u7acb\u51fa\u6765, \u518d\u52a0\u4e0a ourblog \u9879\u76ee\u672c\u8eab,<a href=\"https://github.com/stars/heguangyu5/lists/thinkphp8\" rel=\"nofollow\">\u4e00\u5171 9 \u4e2a repo, \u89c1\u8fd9\u91cc</a>.</p>\n<h2>4. BPC \u7f16\u8bd1: \u8c03\u6574\u4ee3\u7801</h2>\n<p>\u8981\u60f3\u4e00\u884c\u4ee3\u7801\u4e0d\u52a8\u5c31\u80fd\u7f16\u8bd1\u6210\u529f,\u51e0\u4e4e\u662f\u4e0d\u53ef\u80fd\u7684.</p>\n<p>\u4ee3\u7801\u8c03\u6574\u4e3b\u8981\u96c6\u4e2d\u5728 3 \u4e2a\u65b9\u9762:</p>\n<ol>\n<li>\u8bed\u6cd5: bpc \u4e0d\u652f\u6301\u7684\u8bed\u6cd5\u53ef\u4ee5\u901a\u8fc7 <a href=\"https://github.com/bob-php-compiler/phptobpc\" rel=\"nofollow\">phptobpc</a> \u505a\u8f6c\u6362, \u8f6c\u6362\u4e5f\u4e0d\u652f\u6301\u7684,\u5c31\u9700\u8981\u624b\u52a8\u8c03\u6574\u4ee3\u7801\u4e86.</li>\n<li>\u5224\u65ad php \u4ee3\u7801\u6587\u4ef6\u662f\u5426\u5b58\u5728: bpc \u7f16\u8bd1\u540e\u90fd\u662f\u4e8c\u8fdb\u5236\u4e86,\u4e0d\u80fd\u4f7f\u7528 <code>is_file/is_dir/file_exists/glob</code> \u6765\u5224\u65ad,\u8981\u6362\u7528 bpc \u81ea\u5df1\u7684\u4e13\u6709\u51fd\u6570.</li>\n<li>Reflection: bpc \u4e0d\u652f\u6301 Reflection,\u4f7f\u7528 Reflection \u5b9e\u73b0\u7684\u529f\u80fd\u8981\u8c03\u6574\u6210 bpc \u7684\u65b9\u5f0f.</li>\n</ol>\n<p>\u4ee3\u7801\u8c03\u6574\u7684\u7ec6\u8282\u53ef\u4ee5\u67e5\u770b\u6bcf\u4e2a repo \u7684 commit \u5386\u53f2.</p>\n<h2>5. \u8fd0\u884c</h2>\n<ol>\n<li>\u521b\u5efa\u6570\u636e\u5e93</li>\n<li>\u8fd0\u884c <code>tp8-ourblog-althttpd-ubuntu-24.04-amd64</code></li>\n</ol>\n<p>\u8be6\u89c1: <a href=\"https://github.com/heguangyu5/bpc-thinkphp8-ourblog/releases/tag/v0.1\" rel=\"nofollow\">bpc-thinkphp8-ourblog release v0.1</a></p>\n<p>\u540e\u8fb9\u53ef\u4ee5\u51fa\u4e2a\u89c6\u9891\u6765\u6f14\u793a\u4e00\u4e0b\u6574\u4e2a\u7f16\u8bd1\u8fd0\u884c\u7684\u8fc7\u7a0b.</p>\n"
    }
  ]
}