{ "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": "go/php", "feed_url": "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": "member/tmf4ck", "name": "tmf4ck", "avatar": "https://cdn.v2ex.com/avatar/d63a/fcd8/364596_large.png?m=1550216095" }, "url": "t/1203375", "title": "\u6709\u6ca1\u6709\u4ec0\u4e48\u597d\u7528\u7684\u514d\u8d39\u5f00\u6e90 CRM \u7cfb\u7edf", "id": "t/1203375", "date_published": "2026-04-03T08:53:26+00:00", "content_html": "

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

\n" }, { "author": { "url": "member/lanhiy", "name": "lanhiy", "avatar": "https://cdn.v2ex.com/avatar/9d53/fc82/108674_large.png?m=1761704232" }, "url": "t/1196334", "title": "2026 \u5e74 PHP \u8def\u5728\u4f55\u65b9", "id": "t/1196334", "date_published": "2026-03-06T07:07:55+00:00", "content_html": "" }, { "author": { "url": "member/Rust2015", "name": "Rust2015", "avatar": "https://cdn.v2ex.com/avatar/51fd/c72d/674984_large.png?m=1738501691" }, "url": "t/1191055", "title": "2026 \u5e74\uff0c\u5b66 laravel \u6709\u6ca1\u6709\u524d\u9014\uff1a", "id": "t/1191055", "date_published": "2026-02-05T14:06:43+00:00", "content_html": "

\u5982\u9898\uff0c\u4f1a\u4e0d\u4f1a

\n" }, { "author": { "url": "member/sxszzhrrt", "name": "sxszzhrrt", "avatar": "https://cdn.v2ex.com/gravatar/23b764920ac763862cdf62a69d6e94cd?s=73&d=retro" }, "url": "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
\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": "t/1188137" }, { "author": { "url": "member/Loser110", "name": "Loser110", "avatar": "https://cdn.v2ex.com/avatar/4560/7188/552270_large.png?m=1769519292" }, "url": "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

\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

\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

\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": "t/1185421" }, { "author": { "url": "member/baiyekaslana", "name": "baiyekaslana", "avatar": "https://cdn.v2ex.com/avatar/7b23/e490/617120_large.png?m=1709536270" }, "url": "t/1184787", "date_modified": "2026-01-12T02:46:45+00:00", "content_html": "

\u4f7f\u7528\u7684\u6d4b\u8bd5\u6587\u4ef6 info.php,\u8c03\u7528 php.info();\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

\n

\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

\n

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

\n

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

\n

3 \uff0c\u4fee\u6539 cgi.fix_pathinfo=0

\n

4 \uff0c;cgi.force_redirect=1 \u53d6\u6d88\u6ce8\u91ca

\n

\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

\n
\n

user = www-data

\n

group = www-data

\n

listen = /run/php74-fpm.sock

\n

listen.owner = www-data

\n

listen.group = www-data

\n

listen.mode = 0660

\n
\n

/run/php74-fpm.sock \u7684\u5c5e\u7ec4\u548c\u5c5e\u4e3b\u662f www-data

\n

\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

\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": "t/1184787" }, { "author": { "url": "member/Loser110", "name": "Loser110", "avatar": "https://cdn.v2ex.com/avatar/4560/7188/552270_large.png?m=1769519292" }, "url": "t/1184524", "title": "PHP framewok \u6846\u67b6\u63a8\u8350", "id": "t/1184524", "date_published": "2026-01-10T14:22:43+00:00", "content_html": "\u5206\u4eab\u4e00\u4e2a php \u6846\u67b6 flightphp \u3002

3 \u4e2a\u5b57\u5f62\u5bb9\uff1a\u5feb\uff0c\u7b80\u5355\u3002

\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

\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


\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
flightphp \u4e2a\u628a\u5c0f\u65f6\u642d\u5efa\u597d\uff0claravel \u7528\u4e86\u51e0\u5929\u3002

\u521d\u6b65\u6d4b\u8bd5\u4e86\uff0cflightphp \u57fa\u672c\u6bd4 laravel \u5feb 10 \u500d\u4ee5\u4e0a\uff0cAI \u603b\u7ed3\u5177\u4f53\u5982\u4e0b\uff1a


ab -n 5000 -c 50 http://127.0.0.1:51011/up

---

51011 \u2014 /up endpoint

Throughput: ~245 requests/sec

Median latency: ~196 ms

95th percentile: ~263 ms

---

51100 \u2014 / endpoint

Throughput: ~3124 requests/sec

Median latency: ~15 ms

95th percentile: ~28 ms

So 51100 is roughly:

\u2248 12.7\u00d7 more throughput

\u2248 13\u00d7 lower median latency

\u2248 9\u201310\u00d7 lower tail latency (95th)" }, { "author": { "url": "member/sunkangchina", "name": "sunkangchina", "avatar": "https://cdn.v2ex.com/gravatar/02bac72a6dd20f70ca9d1000a0121170?s=73&d=retro" }, "url": "t/1177644", "date_modified": "2025-12-08T09:18:04+00:00", "content_html": "https://github.com/yii2cms/yii2cms

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": "t/1177644" }, { "author": { "url": "member/mimiphp", "name": "mimiphp", "avatar": "https://cdn.v2ex.com/gravatar/c97c5e1b5a6392f107566fd8953d6bbb?s=73&d=retro" }, "url": "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": "t/1177445", "date_published": "2025-12-08T00:41:29+00:00", "content_html": "

\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

\n

\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

\n

apt install -y curl && curl -fL https://wnmp.org/zh/wnmp.sh -o wnmp.sh && chmod +x wnmp.sh && bash wnmp.sh

\n

\u4e00\u5206\u949f\u5b89\u88c5\u5b8c\u6574 Web \u73af\u5883\uff1a

\n\n

\u7cfb\u7edf\u81ea\u52a8\u4f18\u5316\uff1a

\n\n

\u5b89\u5168\u4e3a\u5148 \u00b7 \u9ed8\u8ba4\u5373\u6700\u4f18\uff1a

\n\n

\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

\n

\u5b98\u65b9\u7f51\u7ad9\uff1a https://wnmp.org\n\u793e\u533a\u652f\u6301\uff1aQQ \u7fa4 1075305476 \uff5c Telegram @wnmps\nGithub\uff1a[url]https://github.com/lowphpcom/wnmp[/url]\n\u5f00\u6e90\u534f\u8bae\uff1aGPLv3

\n

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

\n" }, { "author": { "url": "member/florentino", "name": "florentino", "avatar": "https://cdn.v2ex.com/avatar/9c43/a52b/520162_large.png?m=1765959852" }, "url": "t/1177111", "date_modified": "2025-12-05T08:01:19+00:00", "content_html": "

temporal \u5b98\u7f51\u793a\u4f8b

\n

python:

\n
@workflow.defn\nclass SleepForDaysWorkflow:\n # Send an email every 30 days, for the year\n @workflow.run\n async def run(self) -> 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
\n

ruby:

\n
\n# Send an email every 30 days, for the year\nclass SleepForDaysWorkflow < 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
\n

C#:

\n
[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 < 12; i++)\n {\n // Activities have built-in support for timeouts and retries!\n await Workflow.ExecuteActivityAsync(\n (Activities act) => 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
\n

PHP:

\n
class SleepForDaysWorkflow implements SleepForDaysWorkflowInterface\n{\n // Send an email every 30 days.\n public function sleepForDays(): void\n {\n for ($i = 0; $i < 12; $i++) {\n // Activities have timeouts, and will be retried by default!\n $this->sendEmailActivity->sendEmail();\n\n // Sleep for 30 days (yes, really)!\n Workflow::sleep(30 * 24 * 60 * 60)\n }\n }\n}\n
\n

\u611f\u89c9\u5bf9\u4e8e java \u7a0b\u5e8f\u5458 php \u7684\u5fc3\u667a\u8d1f\u62c5\u597d\u5c0f\u554a

\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": "t/1177111" }, { "author": { "url": "member/cj323", "name": "cj323", "avatar": "https://cdn.v2ex.com/gravatar/55d8713a4741083ba73747a518298a1f?s=73&d=retro" }, "url": "t/1174079", "title": "\u672a\u6765\u5c5e\u4e8e PHP", "id": "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

\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

\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

\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

\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

\u2014 \u4e8e PHP 8.5 \u53d1\u5e03\u65e5" }, { "author": { "url": "member/lyxxxh2", "name": "lyxxxh2", "avatar": "https://cdn.v2ex.com/avatar/683e/710d/583505_large.png?m=1776159443" }, "url": "t/1169261", "title": "\u8bb0\u4e00\u6b21\u5fae\u4fe1 access_token invalid credential, access_token is invalid or not latest", "id": "t/1169261", "date_published": "2025-10-29T13:55:15+00:00", "content_html": "

\u573a\u666f

\n

\u591a\u9879\u76ee\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7access_token,\u6bcf\u4e2a\u9879\u76ee\u7684access_token\u4e0d\u5171\u4eab,\u5c31\u4f1a:

\n
{\"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
\n

\u539f\u56e0

\n

\"\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\"

\n

\u6587\u6863:https://developers.weixin.qq.com/doc/oplatform/developers/dev/AccessToken.html

\n

\u5de5\u4f5c\u8fd9\u4e48\u591a\u5e74,\u8fd8\u6ca1\u4ed4\u7ec6\u770b\u8fc7\u5fae\u4fe1\u6587\u6863\u3002

\n

\u89e3\u51b3

\n

\u641e\u4e2d\u63a7\u670d\u52a1\u5668\u9ebb\u70e6,\u4e5f\u61d2\u7740\u6362\u6210 reids \u3002

\n

\u6269\u5c55\u5305\u7528\u7684: w7corp/easywechat

\n

\u9ed8\u8ba4\u7528\u6587\u4ef6\u7684\u7f13\u5b58,\u4fdd\u8bc1\u7528\u540c\u4e2a\u6587\u4ef6\u5c31\u884c\u3002

\n
$app->getAccessToken()->getKey()\n$app->getAccessToken()->getToken()\n\n// \u4e0d\u540c\u7248\u672c,\u65b9\u6cd5\u4e0d\u4e00\u6837\n$app->base->getAccessToken()->getTokenKey()\n$app->base->getAccessToken()->getToken()\n
\n
\n

\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 token\u3002

\n

\u6700\u540e\u4e00\u770b\u5fae\u4fe1\u6587\u6863,\u6211\u64e6 \u7ed3\u6848\u4e86\u3002

\n" }, { "author": { "url": "member/2024", "name": "2024", "avatar": "https://cdn.v2ex.com/avatar/509a/e14e/553106_large.png?m=1761298867" }, "url": "t/1168205", "title": "\u91cd\u9020 PHP -HTTP \u6027\u80fd\u68c0\u6d4b\uff0c\u65b0\u589e List\u3001HashMap", "id": "t/1168205", "date_published": "2025-10-24T09:49:50+00:00", "content_html": "

https://github.com/php-any/origami

\n

\u5728\u8bbf\u95ee hello work \u573a\u666f\u4e0b\uff0c\u548c go http \u6807\u51c6\u5e93\u63a5\u8fd1\uff0c2 \u4e07\u5de6\u53f3 qps \u3002\n\"text\"

\n

\u540c\u65f6\u65b0\u589e\u4e86\u66f4\u52a0\u4fbf\u6377\u7684\u67e5\u8be2

\n
\n$db = open(\"mysql\", \"root:root@/temp\");\n\n$db->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<User>();\n\necho \"=== \u57fa\u7840\u67e5\u8be2 ===\\n\";\n$user = $data->where(\"id = ?\", 100)->first();\ndump($user);\n
\n

\u9664\u4e86 array \u6570\u7ec4\u5916\uff0c\u8fd8\u6709\u589e\u5f3a\u6570\u7ec4

\n
$list = new List<int>();\n$list->add(1);\n$list->add(2);\n$list->add(3);\n\n// \u624b\u52a8\u8fed\u4ee3\n$list->rewind();\nwhile ($list->valid()) {\n echo \"\u7d22\u5f15: \" . $list->key() . \", \u503c: \" . $list->current() . \"\\n\";\n $list->next();\n}\n
\n

KV \u65b9\u5f0f\u7684\u6cdb\u578b\u7c7b

\n
$map = new HashMap<string, int>();\n$map->put(\"apple\", 10);\n$map->put(\"banana\", 20);\n$map->put(\"orange\", 30);\n
\n" }, { "author": { "url": "member/hwhtj", "name": "hwhtj", "avatar": "https://cdn.v2ex.com/avatar/c7a8/558c/100031_large.png?m=1770429207" }, "url": "t/1160327", "date_modified": "2025-09-18T13:23:31+00:00", "content_html": "

`<?php

\n

$nowtime=time();

\n

$pastsec = $nowtime - $_GET[\"t\"];

\n

if($pastsec<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<script language=Javascript src='http://www.v2ex.com/index/thumb.png' data-original=\"html.php?t=\".$nowtime.\"\"></script>\"; //\u52a0\u4e0a\u8c03\u7528\u66f4\u65b0\u7a0b\u5e8f\u7684\u4ee3\u7801

\n

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);
\n}\n}\n?>`

\n

\u4ee5\u4e0a\u4ee3\u7801\u7528\u4e8e\u751f\u6210 typecho \u9996\u9875 index.html \uff0c\u8fd0\u884c\u65f6\u63d0\u793a\u9519\u8bef\uff1a\nWarning: Undefined array key \"t\" in /www/onlineps.top/learn/html.php on line 3\n\u6c42\u52a9\u9ad8\u624b\u5e2e\u6211\u6539\u5199\u4ee5\u4e0a\u4ee3\u7801\u3002

\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": "t/1160327" }, { "author": { "url": "member/fruitmonster", "name": "fruitmonster", "avatar": "https://cdn.v2ex.com/gravatar/f425ed8fb4fd47b9c0ea6ab846b72db4?s=73&d=retro" }, "url": "t/1158743", "date_modified": "2025-09-12T05:51:27+00:00", "content_html": "

\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

\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": "t/1158743" }, { "author": { "url": "member/cj323", "name": "cj323", "avatar": "https://cdn.v2ex.com/gravatar/55d8713a4741083ba73747a518298a1f?s=73&d=retro" }, "url": "t/1155173", "title": "PHP 8.5 \u52a0\u5165\u4e86 pipe \u8bed\u6cd5", "id": "t/1155173", "date_published": "2025-08-27T01:25:32+00:00", "content_html": "

https://php.watch/versions/8.5/pipe-operator

\n
$result = \"Hello World\"\n |> strtoupper(...)\n |> str_shuffle(...)\n |> trim(...);\n
\n

\u540c\u6837\u8bed\u6cd5 JS \u90a3\u8fb9\u5361\u4e86\u5f88\u4e45\uff0cPHP \u76f4\u63a5\u4e0a\u4e86\u3002

\n" }, { "author": { "url": "member/tg11", "name": "tg11", "avatar": "https://cdn.v2ex.com/gravatar/f336ff094ec4d6520b3e3bc570e8d2c3?s=73&d=retro" }, "url": "t/1154669", "date_modified": "2025-08-25T01:48:39+00:00", "content_html": "

\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

\n

github \u5730\u5740 https://github.com/tg111/php-request

\n

\u76f4\u63a5\u5b89\u88c5

\n
composer require tg111/php-request\n
\n

\u793a\u4f8b

\n
use PhpRequest\\PhpRequest;\n\n// \u7b80\u5355\u7684 GET \u8bf7\u6c42\n$respOnse= PhpRequest::get('https://httpbin.org/get');\necho $response->text();\n\n// \u5e26\u53c2\u6570\u7684 GET \u8bf7\u6c42\n$respOnse= PhpRequest::get('https://httpbin.org/get', [\n 'key1' => 'value1',\n 'key2' => 'value2'\n]);\n\n// POST \u8bf7\u6c42\n$respOnse= PhpRequest::post('https://httpbin.org/post', [\n 'username' => 'user',\n 'password' => 'pass'\n]);\n\n// JSON POST \u8bf7\u6c42\n$respOnse= PhpRequest::post('https://httpbin.org/post', [\n 'name' => '\u5f20\u4e09',\n 'email' => 'zhangsan@example.com'\n], [\n 'headers' => ['Content-Type' => 'application/json']\n]);\n
\n

\u4f7f\u7528\u5168\u5c40\u51fd\u6570

\n
$respOnse= requests_get('https://httpbin.org/get');\n$respOnse= requests_post('https://httpbin.org/post', ['key' => 'value']);\n
\n

\u81ea\u5b9a\u4e49\u8bf7\u6c42\u5934\u548c\u8eab\u4efd\u9a8c\u8bc1

\n
$respOnse= PhpRequest::get('https://httpbin.org/cookies', [], [\n 'cookies' => [\n 'session_id' => 'abc123456789',\n 'user_preference' => 'dark_mode'\n ]\n]);\n# cookies\n$respOnse= PhpRequest::get('https://httpbin.org/cookies', [], [\n 'cookies' => [\n 'session_id' => 'abc123456789',\n 'user_preference' => 'dark_mode'\n ]\n]);\n
\n

session \u4f1a\u8bdd\u7ba1\u7406

\n

\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

\n
use PhpRequest\\PhpRequest;\n\n// \u521b\u5efa\u4f1a\u8bdd\n$session = PhpRequest::session()\n ->setHeaders([\n 'Authorization' => 'Bearer token123',\n 'Accept' => 'application/json'\n ])\n ->setCookies([\n 'session_id' => 'session123'\n ])\n ->setTimeout(60);\n\n// \u4f7f\u7528\u4f1a\u8bdd\u8fdb\u884c\u591a\u4e2a\u8bf7\u6c42\n$profile = $session->get('/user/profile');\n$settings = $session->get('/user/settings');\n$updated = $session->post('/user/update', ['name' => '\u65b0\u540d\u79f0']);\n
\n

\u54cd\u5e94\u5bf9\u8c61

\n
$respOnse= PhpRequest::get('https://httpbin.org/json');\n\n// \u83b7\u53d6\u54cd\u5e94\u5185\u5bb9\n$text = $response->text(); // \u539f\u59cb\u6587\u672c\u5185\u5bb9\n$data = $response->json(); // \u89e3\u6790 JSON \u54cd\u5e94\n$code = $response->getStatusCode(); // HTTP \u72b6\u6001\u7801\n\n// \u68c0\u67e5\u54cd\u5e94\u72b6\u6001\n$success = $response->ok(); // 2xx \u72b6\u6001\u7801\u4e3a true\n$isClientError = $response->isClientError(); // 4xx \u72b6\u6001\u7801\u4e3a true\n$isServerError = $response->isServerError(); // 5xx \u72b6\u6001\u7801\u4e3a true\n\n// \u83b7\u53d6\u5934\u90e8\u548c\u5143\u6570\u636e\n$headers = $response->getHeaders();\n$cOntentType= $response->getContentType();\n$totalTime = $response->getTotalTime();\n$url = $response->getUrl();\n\n// \u4fdd\u5b58\u54cd\u5e94\u5230\u6587\u4ef6\n$response->save('/path/to/file.json');\n
\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": "t/1154669" }, { "author": { "url": "member/mimiphp", "name": "mimiphp", "avatar": "https://cdn.v2ex.com/gravatar/c97c5e1b5a6392f107566fd8953d6bbb?s=73&d=retro" }, "url": "t/1153000", "title": "\u5927\u5bb6\u597d\uff0c\u6211\u53c8\u4f86\u4e86\uff0c\u65b0\u4f5c\u54c1 https://www.freetalkhub.com\uff0c PHP \u5f00\u53d1", "id": "t/1153000", "date_published": "2025-08-17T11:41:29+00:00", "content_html": "

\u672c\u4eba\u662f php \u72ec\u7acb\u5f00\u53d1\u8005\uff0c\u4ee5\u524d\u7684\u8bdd\u9898 t/994939\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

\n

\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

\n

\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

\n

\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

\n

\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

\n

\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

\n

\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

\n

\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

\n

\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

\n

\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

\n

\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

\n

\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

\n

\u6240\u4ee5\u57fa\u4e8e\u4ee5\u4e0a\u7684\u524d\u63d0\uff0c\u6211\u60f3\u8bf4\u4e00\u4e0b\u6211\u8fd9\u4e2a https://www.freetalkhub.com \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

\n

\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

\n

\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

\n

\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

\n" }, { "author": { "url": "member/sxszzhrrt", "name": "sxszzhrrt", "avatar": "https://cdn.v2ex.com/gravatar/23b764920ac763862cdf62a69d6e94cd?s=73&d=retro" }, "url": "t/1147927", "title": "laravel \u548c thinkphp \u9009\u62e9\u54ea\u4e2a\uff1f", "id": "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": "member/heguangyu5", "name": "heguangyu5", "avatar": "https://cdn.v2ex.com/avatar/b740/e481/159374_large.png?m=1579242902" }, "url": "t/1134248", "title": "202505 \u6700\u65b0\u8c03\u7814\uff1a PHP Opcode \u52a0\u5bc6\u6df7\u6dc6\u54ea\u5bb6\u5f3a?", "id": "t/1134248", "date_published": "2025-05-26T00:47:27+00:00", "content_html": "

\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.

\n

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.

\n

\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:

\n
    \n
  1. \u5982\u4f55\u62ff\u5230\u52a0\u5bc6\u6df7\u6dc6\u540e\u7684 opcode.
  2. \n
  3. opcode \u80fd\u53cd\u7f16\u8bd1\u56de PHP \u4ee3\u7801\u5417?
  4. \n
\n

\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 AAA \u548c BBB.

\n

AAA \u662f\u56fd\u5185\u4ea7\u54c1,\u53f7\u79f0 \"\u6700\u4f73 PHP \u6e90\u4ee3\u7801\u52a0\u5bc6\u7f16\u8bd1\u5668\".

\n

BBB \u662f\u56fd\u5916\u4ea7\u54c1,\u53f7\u79f0 \"the most widely trusted PHP protection tool\".

\n

\u5148\u6765\u770b AAA.

\n

AAA

\n

\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 PDO \u7c7b\u8fdb\u884c\u7b80\u6613\u5c01\u88c5\u7684 Db \u7c7b. \u5b8c\u6574\u6e90\u7801\u89c1: Db.php

\n

\u7136\u540e,\u4f7f\u7528 AAA \u8bd5\u7528\u7248 \u5bf9Db.php \u52a0\u5bc6, \u52a0\u5bc6\u65f6\u9009\u62e9 PHP \u7248\u672c 8.0,\u52a0\u5bc6\u5b8c\u6210\u540e\u4e0b\u8f7d\u56de\u6765,\u7136\u540e\u5c06\u5bf9\u5e94\u7684 AAA_loader_80_nts.so\u4e5f\u4e0b\u8f7d\u56de\u6765.

\n

php \u7684 opcache \u6269\u5c55\u6709\u4e2a\u65b9\u4fbf\u7684\u529f\u80fd,\u53ef\u4ee5\u628a php \u4ee3\u7801\u7684 opcode dump \u51fa\u6765.

\n
$ ~/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
\n

\u73b0\u5728\u6211\u4eec\u62ff\u5230\u4e86 Db.php \u672a\u52a0\u5bc6\u6df7\u6dc6\u7684 opcode.

\n

\u518d\u6765\u770b\u770b AAA \u52a0\u5bc6\u6df7\u6dc6\u8fc7\u7684 Db-AAA.php \u7684 opcode \u957f\u4ec0\u4e48\u6837.\n\u5c06 AAA_loader_80_nts.so \u52a0\u5230 php.ini \u91cc\u5e76\u914d\u7f6e\u597d.

\n
~/tmp/php-8.0.30/bin/php -d 'opcache.enable_cli=1' -d 'opcache.opt_debug_level=0x1000' Db-AAA.php\n
\n

\u4ec0\u4e48\u8f93\u51fa\u90fd\u6ca1\u6709.

\n

\u53ef\u4ee5\u7406\u89e3,\u5e94\u8be5\u662f AAA_loader_80_nts.so \u6765\u63a5\u7ba1\u5904\u7406 Db-AAA.php, opcache \u6269\u5c55\u4e0d\u8d77\u4f5c\u7528\u4e86.

\n

\u90a3\u8fd8\u6709\u4ec0\u4e48\u529e\u6cd5\u80fd\u62ff\u5230 opcode \u5417?\u53ef\u4ee5\u7528 phpdbg.

\n
$ ~/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<-1> 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<3> \"PDO\" @0\n L2147483647 #1 YIELD<1> \"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<1> \"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<1> \"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
\n

\u4e0d\u8fc7 phpdbg \u8f93\u51fa\u7684 opcode \u6ca1\u6709 opcache \u8f93\u51fa\u7684\u6613\u8bfb,\u6bd4\u5982\u6700\u540e\u4e00\u4e2a\u51fd\u6570OurBlog_Db::__call()\u91cc\u7684call_user_func_array()\u6ca1\u663e\u793a\u5b8c\u6574,\u53ea\u663e\u793a\u4e86\u4e2acall_user_func_ar.

\n

\u6709\u6ca1\u6709\u529e\u6cd5\u8ba9 php-8.0.30 \u7684 phpdbg \u8f93\u51fa\u50cf opcache \u90a3\u79cd\u6837\u5f0f\u7684 opcode \u5462?

\n

\u8fd9\u91cc\u53ea\u6240\u4ee5\u8981\u5f3a\u8c03 php-8.0.30 \u7684 phpdbg , \u662f\u56e0\u4e3a php-8.3 \u7684 phpdbg \u8f93\u51fa\u7684 opcode \u5df2\u7ecf\u548c opcache \u98ce\u683c\u7edf\u4e00\u4e86.

\n

\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.

\n

\u7ed9 phpdbg \u65b0\u52a0\u4e00\u4e2a\u53c2\u6570-p**,\u6765\u8c03\u7528 opcache \u91cc\u7684 dump \u76f8\u5173\u4ee3\u7801.

\n
$ ~/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
\n

\u597d,\u73b0\u5728\u6211\u4eec\u62ff\u5230\u4e86 AAA \u52a0\u5bc6\u6df7\u6dc6\u8fc7\u7684 opcode.

\n

\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!

\n

\u4ee5\u4e0b\u662f Google Gemini \u53cd\u7f16\u8bd1\u7684\u7ed3\u679c:

\n

@see https://g.co/gemini/share/148782890130

\n

\u5927\u5bb6\u53ef\u4ee5\u81ea\u884c\u5bf9\u6bd4\u4e00\u4e0b,\u53cd\u6b63\u6211\u662f\u88ab\u9707\u60ca\u5230\u4e86!

\n

\u4e5f\u6709\u53ef\u80fd Db.php \u7684\u4ee3\u7801\u8f83\u4e3a\u5e38\u89c1,\u88ab AI \u8499\u5bf9\u4e86.

\n

\u817e\u8baf\u5143\u5b9d DeepSeek-R1 \u53cd\u7f16\u8bd1\u7684\u7ed3\u679c\u5982\u4e0b:

\n

@see https://yuanbao.tencent.com/bot/app/share/chat/KUiqoTNjZalJ

\n

AAA \u7684\u8c03\u7814\u6211\u4eec\u5148\u5230\u8fd9\u91cc.

\n

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.

\n

BBB

\n

\u53bb BBB \u7684\u7f51\u7ad9\u4e0a\u628a BBB \u7684 encoder \u8bd5\u7528\u7248 \u548c loader \u90fd\u4e0b\u8f7d\u56de\u6765.

\n

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.

\n

\u540c\u6837\u5bf9 Db.php \u8fdb\u884c\u52a0\u5bc6, \u5f97\u5230\u52a0\u5bc6\u540e\u7684\u6587\u4ef6 Db-BBB.php

\n
./BBB_encoder_evaluation/BBB_encoder.sh -C -x86-64 -83 ../Db.php -o Db-BBB.php\n
\n

\u63a5\u4e0b\u6765\u6211\u4eec\u7528\u540c\u6837\u7684\u529e\u6cd5\u5c1d\u8bd5\u62ff\u5230 Db-BBB.php \u7684 opcode.

\n

\u5c06 BBB_loader_lin_8.3.so \u52a0\u5230 php.ini \u91cc\u914d\u7f6e\u597d.

\n

\u5148\u7528 opcache \u5c1d\u8bd5\u4e00\u4e0b:

\n
$ ~/tmp/php-8.3.21/bin/php -d 'opcache.enable_cli=1' -d 'opcache.opt_debug_level=0x1000' Db-BBB.php\n
\n

\u6ca1\u6709\u4efb\u4f55\u8f93\u51fa.

\n

\u518d\u7528 phpdbg \u5c1d\u8bd5\u4e00\u4e0b:

\n
$ ~/tmp/php-8.3.21/bin/phpdbg -p* Db-BBB.php\nSegmentation fault (core dumped)\n
\n

\u76f4\u63a5 segfault \u4e86.

\n

\u6211\u4eec\u4f7f\u7528 gdb \u6765\u8c03\u8bd5\u4e00\u4e0b.

\n
$ 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
\n

\u5bf9\u6bd4\u4e24\u6b21 p *ret \u4e0d\u96be\u53d1\u73b0, \u672a\u52a0\u5bc6\u7684 Db.php:

\n

opcodes = 0x7ffff5002450, reserved = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}

\n

\u5df2\u52a0\u5bc6\u7684 Db-BBB.php:

\n

opcodes = 0x1, reserved = {0x0, 0x0, 0x0, 0x7ffff5081460, 0x0, 0x0}

\n

0x1 \u663e\u7136\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u5185\u5b58\u5730\u5740,\u73b0\u5728 opcode \u5728\u54ea\u513f,\u4e0d\u597d\u627e\u4e86.

\n

\u518d\u6b21 gdb \u5173\u6ce8\u4e00\u4e0b zend_compile_file \u548c zend_execute_ex:

\n
$ 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 <phar_compile_file>\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 <execute_ex>\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
\n

\u53ef\u4ee5\u770b\u5230 BBB_loader_lin_8.3.so \u65e2\u63a5\u7ba1\u4e86 zend_compile_file, \u53c8\u63a5\u7ba1\u4e86 zend_execute_ex.\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.

\n

\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?

\n

\u522b\u6025,\u7f51\u4e0a\u641c\u7d22\u4e00\u4e0b. \u5f88\u5feb\u5c31\u627e\u5230\u4e86\u8fd9\u4e2a https://dezender.xyz/

\n

\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.

\n

\u6210\u529f\u89e3\u5bc6.

\n
<?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->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->pdo->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
\n

\u7b80\u76f4\u592a\u5f3a\u4e86!!!

\n

\u603b\u7ed3

\n
    \n
  1. 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.
  2. \n
  3. BBB \u4e0d\u5bb9\u6613\u62ff\u5230\u52a0\u5bc6\u6df7\u6dc6\u8fc7\u7684 opcodes, \u4f46\u6709\u6210\u719f\u7684\u53cd\u7f16\u8bd1\u5de5\u5177.
  4. \n
\n" }, { "author": { "url": "member/tangknox1", "name": "tangknox1", "avatar": "https://cdn.v2ex.com/gravatar/a1a7952e770bca1b3c559bfdba68ac5b?s=73&d=retro" }, "url": "t/1128998", "title": "\u6709\u505a\u8fc7\u57fa\u4e8e webrtc \u6280\u672f\u7684\u591a\u4eba\u89c6\u9891\u4f1a\u8bae\u7cfb\u7edf\u7684\u5417", "id": "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

\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": "member/Tinywan", "name": "Tinywan", "avatar": "https://cdn.v2ex.com/avatar/62fd/0bb6/555337_large.png?m=1642057532" }, "url": "t/1128749", "title": "2025 \u5e74 PHP \u8def\u5728\u4f55\u65b9", "id": "t/1128749", "date_published": "2025-04-28T14:55:52+00:00", "content_html": "" }, { "author": { "url": "member/TESTFLIGHT2021", "name": "TESTFLIGHT2021", "avatar": "https://cdn.v2ex.com/gravatar/f81d1103c117a67a0be5f6f3081250bc?s=73&d=retro" }, "url": "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": "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
\u8bf7\u95ee\u8fd9\u600e\u4e48\u89e3\u51b3\u554a\uff1f" }, { "author": { "url": "member/seansong", "name": "seansong", "avatar": "https://cdn.v2ex.com/gravatar/13b01d3f97cd23d88c602a486ccbc63c?s=73&d=retro" }, "url": "t/1128194", "title": "\u6709\u4e2a\u5173\u4e8e PHP \u7684\u5c0f\u7591\u60d1", "id": "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

\"is_completed\": 0
\"is_completed\": \"0\"
\"is_completed\": false

\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

\u5f31\u7c7b\u578b\uff0c\u597d\u50cf\u80fd\u7406\u89e3\uff0c\u4f46\u5c31\u662f\u597d\u5947\u7f62\u4e86" }, { "author": { "url": "member/awanganddong", "name": "awanganddong", "avatar": "https://cdn.v2ex.com/gravatar/e482df556a9ac0e4553da45a819ba931?s=73&d=retro" }, "url": "t/1127661", "title": "workman \u4e0e\u963f\u91cc\u4e91\u5b9e\u65f6\u8bed\u97f3\u901a\u4fe1\u7684\u95ee\u9898\u3002", "id": "t/1127661", "date_published": "2025-04-23T17:33:31+00:00", "content_html": "
 /**\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->headers = [\n \"Authorization\" => \"Bearer \" . getenv(\"DASHSCOPE_API_KEY\"),\n ];\n $ws->transport = \"ssl\";\n\n // \u8fde\u63a5\u6210\u529f\u56de\u8c03\n $ws->OnConnect= function ($ws) {\n self::$aliWs = $ws;\n echo \"connected success:\" . $ws->id . \"\\n\";\n };\n\n // \u5f53\u6536\u5230\u6d88\u606f\u65f6\n $ws->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->push($msg);\n },\n );\n };\n\n // \u8fde\u63a5\u5173\u95ed\u65f6\u8fdb\u884c\u91cd\u8fde\n $ws->OnClose= function ($ws) {\n echo \"\u8fde\u63a5\u5173\u95ed\uff0c\u5c1d\u8bd5\u91cd\u65b0\u8fde\u63a5...\\n\";\n self::$aliWs = null;\n $ws->reConnect(1);\n };\n $ws->OnError= function ($ws) {\n echo \"\u9519\u8bef\u8f93\u51fa\" . $ws->error;\n };\n $ws->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->send(json_encode($data));\n }\n
\n

\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

\n" }, { "author": { "url": "member/xmlf", "name": "xmlf", "avatar": "https://cdn.v2ex.com/avatar/11cd/92da/230161_large.png?m=1668495807" }, "url": "t/1126479", "title": "\u76ee\u524d PHP \u4e2d\u6bd4\u8f83\u597d\u7528\u7684\u5de5\u4f5c\u6d41\u5f15\u64ce\u6709\u54ea\u4e9b\uff1f", "id": "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

\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": "member/carl92", "name": "carl92", "avatar": "https://cdn.v2ex.com/gravatar/4f4df97a974b6ac050755f35c621e882?s=73&d=retro" }, "url": "t/1124523", "title": "\u6709\u8001\u54e5\u719f\u6089 OpenCart \u7684\u5417\uff1f", "id": "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": "member/akagishigeru", "name": "akagishigeru", "avatar": "https://cdn.v2ex.com/avatar/e5be/294f/320577_large.png?m=1758709048" }, "url": "t/1123931", "date_modified": "2025-04-08T05:38:08+00:00", "content_html": "

\u5728\u505a\u7684\u4e00\u4e9b\u9879\u76ee\u7684 package \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

\n

\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u5173\u6ce8\u4e0b \ud83d\ude02 Packvault \u5f00\u6e90\u5730\u5740

\n

\u505a\u4e00\u4e9b PHP \u9879\u76ee \u7136\u540e\u7ed9\u7528\u6237\u505a\u5206\u53d1\u8fd8\u662f\u633a\u6709\u7528\u7684

\n", "date_published": "2025-04-08T05:37:40+00:00", "title": "\u5f00\u6e90 PHP Composer \u79c1\u6709 package \u7ba1\u7406\u5e73\u53f0", "id": "t/1123931" }, { "author": { "url": "member/flowerwow0316", "name": "flowerwow0316", "avatar": "https://cdn.v2ex.com/gravatar/3fdbd28306d7468e08b5a91076a20255?s=73&d=retro" }, "url": "t/1123546", "title": "\u63a8\u8350\u4e2a\u597d\u7528\u7684\u96c6\u6210\u73af\u5883", "id": "t/1123546", "date_published": "2025-04-06T09:51:52+00:00", "content_html": "

https://flyenv.com/\n\u7b2c\u4e00\u6b21\u89c1\u8fd9\u4e48\u53fc\u7684\uff0c\u80fd\u4ec0\u4e48\u90fd\u96c6\u6210\u5728\u4e00\u8d77\u7684\u3002

\n" }, { "author": { "url": "member/hukei", "name": "hukei", "avatar": "https://cdn.v2ex.com/avatar/31c0/294c/615622_large.png?m=1770367727" }, "url": "t/1122589", "title": "phpinfo(); logo \u53d8\u6210\u4e86\u7eff\u8272\u7684\u5927\u8c61", "id": "t/1122589", "date_published": "2025-04-01T07:34:00+00:00", "content_html": "PHP \u5bf9\u611a\u4eba\u8282\u7684\u73a9\u7b11 -_-" }, { "author": { "url": "member/tlerbao", "name": "tlerbao", "avatar": "https://cdn.v2ex.com/avatar/9deb/c5d9/421999_large.png?m=1745547699" }, "url": "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

\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": "t/1117090" }, { "author": { "url": "member/fan88", "name": "fan88", "avatar": "https://cdn.v2ex.com/avatar/b45b/9532/356765_large.png?m=1746960603" }, "url": "t/1116197", "title": "\u60f3\u7528 PHP \u505a\u5fae\u670d\u52a1\u5f00\u53d1\uff0c\u6709\u507f\u6c42\u6307\u5bfc", "id": "t/1116197", "date_published": "2025-03-05T15:52:24+00:00", "content_html": "

\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

\n" }, { "author": { "url": "member/AndrewHenry", "name": "AndrewHenry", "avatar": "https://cdn.v2ex.com/avatar/4910/cb40/621873_large.png?m=1748669696" }, "url": "t/1112469", "title": "PHP \u8bed\u8a00\u5df2\u7ecf\u8fc7\u6c14\u4e86\u5417", "id": "t/1112469", "date_published": "2025-02-18T19:12:07+00:00", "content_html": "" }, { "author": { "url": "member/zhouyin", "name": "zhouyin", "avatar": "https://cdn.v2ex.com/gravatar/e450dd47c26a447dd25d9d7f95dae113?s=73&d=retro" }, "url": "t/1108309", "title": "\u56fd\u5185 PHP \u5377\u738b\u662f\u9e1f\u54e5", "id": "t/1108309", "date_published": "2025-01-30T00:30:17+00:00", "content_html": "

\u6700\u8fd1\u5b66\u4e86 python \u539f\u751f\u534f\u7a0b async await \u4ee5\u53ca asyncio \u5e93

\n

\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()

\n

php \u7684\u534f\u7a0b\u4ee3\u7801\u4e5f\u662f\u770b\u8d77\u6765\u592a\u5570\u55e6 \u4e00\u56e2\u7cdf

\n

\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

\n" }, { "author": { "url": "member/awanganddong", "name": "awanganddong", "avatar": "https://cdn.v2ex.com/gravatar/e482df556a9ac0e4553da45a819ba931?s=73&d=retro" }, "url": "t/1105356", "date_modified": "2025-01-15T11:25:54+00:00", "content_html": "

\u540e\u53f0\u6709\u4e00\u4e2a\u6279\u91cf\u64cd\u4f5c\u7684\u529f\u80fd\u3002

\n

\u7528\u6237\u5ba1\u6838\u901a\u8fc7\uff0c\u7136\u540e\u7ed9\u4ed6\u7684\u9080\u8bf7\u4eba\u52a0\u4f18\u60e0\u4ef7\u3002

\n
\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
\n

\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

\n

\u7ed9\u7528\u6237\u52a0\u4f18\u60e0\u5377\u6709 2 \u4e2a\u63d2\u5165\u64cd\u4f5c\uff0c\u4e00\u4e2a\u66f4\u65b0\u64cd\u4f5c\u3002

\n

\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

\n", "date_published": "2025-01-15T11:24:45+00:00", "title": "mysql update \u66f4\u65b0\u5931\u8d25\u7684\u539f\u56e0\u3002", "id": "t/1105356" }, { "author": { "url": "member/hkui2012", "name": "hkui2012", "avatar": "https://cdn.v2ex.com/gravatar/a067974defa83fe89f116d09b37c6b89?s=73&d=retro" }, "url": "t/1101729", "title": "PHP \u7a0b\u5e8f\u5458\u662f\u5f80\u8fd0\u7ef4\u8fd8\u662f\u524d\u7aef\u53d1\u5c55\u4f5c\u4e3a\u62d3\u5c55\u5462", "id": "t/1101729", "date_published": "2025-01-01T01:57:24+00:00", "content_html": "

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

\n

\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

\n" }, { "author": { "url": "member/SEoSean", "name": "SEoSean", "avatar": "https://cdn.v2ex.com/gravatar/3a446a1e95f5f81b8ffd4a74c9b3ca21?s=73&d=retro" }, "url": "t/1093198", "title": "\u6c42\u5927\u4f6c\u89e3\u51b3\u4e00\u4e0b\u4e00\u4e2a\u95ee\u9898", "id": "t/1093198", "date_published": "2024-11-27T11:50:07+00:00", "content_html": "

\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

\n" }, { "author": { "url": "member/coderzhangsan", "name": "coderzhangsan", "avatar": "https://cdn.v2ex.com/gravatar/45c2ed6b86a63716a98aae801bcde8ce?s=73&d=retro" }, "url": "t/1092397", "date_modified": "2024-11-25T06:12:14+00:00", "content_html": "

RT

\n

\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

\n

PHP 8.4 Release

\n", "date_published": "2024-11-25T06:11:17+00:00", "title": "[2024-11-21] PHP 8.4 Released!", "id": "t/1092397" }, { "author": { "url": "member/ruobingm", "name": "ruobingm", "avatar": "https://cdn.v2ex.com/avatar/fb43/abe2/349046_large.png?m=1724483437" }, "url": "t/1089278", "title": "\u5982\u4f55\u83b7\u5f97\u6296\u97f3\u89c6\u9891\u64ad\u653e\u91cf\uff1f\u5404\u4f4d\u5927\u725b\u652f\u652f\u62db~", "id": "t/1089278", "date_published": "2024-11-13T09:31:01+00:00", "content_html": "

\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\"\"\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

\n" }, { "author": { "url": "member/yanwushu7", "name": "yanwushu7", "avatar": "https://cdn.v2ex.com/avatar/61d7/1a78/204056_large.png?m=1730706691" }, "url": "t/1086502", "title": "\u5982\u4f55\u4f18\u96c5\u5730\u5207\u6362 composer \u955c\u50cf", "id": "t/1086502", "date_published": "2024-11-04T07:55:26+00:00", "content_html": "

\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

\n

\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

\n

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

\n

xserver

\n" }, { "author": { "url": "member/cbasil", "name": "cbasil", "avatar": "https://cdn.v2ex.com/gravatar/4e8b717661a908f321138203829e6e4b?s=73&d=retro" }, "url": "t/1085268", "title": "\u4e0e\u94f6\u884c\u5bf9\u63a5 sm4 \u56fd\u5bc6\u7b97\u6cd5", "id": "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
php \u76f8\u5173\u56fd\u5bc6\u7b97\u6cd5\u7684\u6559\u7a0b\u5f88\u5c11\uff0c\u627e\u4e86\u597d\u4e45\u624d\u627e\u5230 github \u4e0a\u7684\u5305[https://github.com/lizhichao/sm]( https://github.com/lizhichao/sm)
\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
\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.
\u52a0\u5bc6\u540e\u7684\u5b57\u7b26\u7f16\u7801\u4e5f\u6709 hex \u548c base64 \u533a\u5206\u3002

\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": "member/Yesr00", "name": "Yesr00", "avatar": "https://cdn.v2ex.com/gravatar/c07b11f7b2e957d9c359a7a853a8e4a1?s=73&d=retro" }, "url": "t/1084412", "title": "Laravel \u4e8c\u624b\u9879\u76ee\uff0c\u8bed\u8a00\u5207\u6362\u95ee\u9898\uff0c\u6c42\u89e3", "id": "t/1084412", "date_published": "2024-10-28T12:41:30+00:00", "content_html": "

RT,\u521b\u5efa\u4e86\u4e00\u4e2a SetLang \u4e2d\u95f4\u4ef6\uff0c \u4ee3\u7801\u5982\u4e0b\uff1a

\n

if($request->input('lang')){\napp()->setLocale($request->input('lang'));\n}

\n

return $next($request);

\n

\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()->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

\n" }, { "author": { "url": "member/yxzblue", "name": "yxzblue", "avatar": "https://cdn.v2ex.com/avatar/7f13/9acf/23511_large.png?m=1711437097" }, "url": "t/1081563", "date_modified": "2024-10-18T08:36:41+00:00", "content_html": "

1 \u3001http://106.15.186.69:8061/

\n

2 \u3001http://106.15.186.69:8097/

\n", "date_published": "2024-10-18T08:36:16+00:00", "title": "\u4e24\u9053 PHP \u9898\u76ee\uff0c\u90fd\u662f\u6c42 flag \u503c", "id": "t/1081563" }, { "author": { "url": "member/RunningRabbit", "name": "RunningRabbit", "avatar": "https://cdn.v2ex.com/gravatar/323356221814cff57ac4336223d44c0d?s=73&d=retro" }, "url": "t/1074541", "title": "\u5e2e\u5fd9\u63a8\u8350\u4e00\u4e2a\u5f00\u6e90\u8bba\u575b\u6e90\u7801\uff1f", "id": "t/1074541", "date_published": "2024-09-21T01:28:13+00:00", "content_html": "

\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

\n" }, { "author": { "url": "member/akagishigeru", "name": "akagishigeru", "avatar": "https://cdn.v2ex.com/avatar/e5be/294f/320577_large.png?m=1758709048" }, "url": "t/1070582", "title": "Laravel \u5b8c\u6210\u4e86 A \u8f6e\u878d\u8d44\ud83c\udf89", "id": "t/1070582", "date_published": "2024-09-05T15:02:27+00:00", "content_html": "

@Taylor

\n
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
\n

\u9996\u8f6e\u878d\u8d44 5700 \u4e07\u7f8e\u91d1\u3002

\n

\u53ef\u4ee5\u7528\u4e0a\u514d\u8d39\u7684 Laravel Cloud \u4ea7\u54c1\u54af

\n" }, { "author": { "url": "member/pixcai", "name": "pixcai", "avatar": "https://cdn.v2ex.com/avatar/b773/6a8b/328678_large.png?m=1740145107" }, "url": "t/1069110", "date_modified": "2024-08-30T10:54:54+00:00", "content_html": "

\u4e0d\u5f97\u4e0d\u8bf4PHP\u7684Laravel\u6846\u67b6\uff08\u6216\u8005ThinkPHP\uff09\u662f\u771f\u7684\u597d\u7528\u554a\uff0c\u5f88\u591a\u529f\u80fd\u5f00\u7bb1\u5373\u7528\uff0c\u4e3a\u4ec0\u4e48\u73b0\u5728\u7684Web\u6846\u67b6\u53cd\u800c\u4e0d\u8fd9\u4e48\u505a\u4e86\u5462\uff1f

\n

\u6bd4\u5982Go\u7684Gin\uff0cNode\u7684express\uff0cPython\u7684Flask\uff0c\u90fd\u662f\u5b9a\u4e49\u8def\u7531\u3001\u8fd4\u56deJSON\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\u7684Vue\u3001React\u3001Tailwind CSS\u8fd9\u4e9b\u4e86\uff0c\u4e0d\u4f1a\u524d\u7aef\u7684\u641e\u914d\u7f6e\u90fd\u8981\u641e\u534a\u5929\u3002

\n

\u53cd\u89c2Laravel\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

\n

\u72e0\u72e0\u5730\u88ab\u60ca\u8273\u5230\u4e86\uff01

\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": "t/1069110" }, { "author": { "url": "member/est", "name": "est", "avatar": "https://cdn.v2ex.com/avatar/c3e8/78e2/362_large.png?m=1774152156" }, "url": "t/1068087", "date_modified": "2024-08-27T03:26:15+00:00", "content_html": "

\u6709\u8fd9\u6837\u4e00\u4e2a serverless \u5e73\u53f0\uff1a

\n
    \n
  1. \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
  2. \n
  3. \u901a\u8fc7 FTP \u4e4b\u7c7b\u7684\u6807\u51c6\u5de5\u5177\u90e8\u7f72\uff0c\u800c\u4e0d\u662f\u8111\u6b8b\u7684\u547d\u4ee4\u884c
  4. \n
  5. \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
  6. \n
  7. \u867d\u7136\u4e0d\u662f docker \uff0c\u4f46\u662f vhost \u591f\u7528\u4e86\u3002\u800c\u4e14\u8981\u5bb9\u5668\u5316 vhost \u4e5f\u5f88\u5bb9\u6613
  8. \n
  9. \u8ba9\u4eba\u68a6\u5bd0\u4ee5\u6c42\u7684\u201c\u70ed\u66f4\u65b0\u201d\u6280\u672f
  10. \n
  11. \u8d85\u7ea7\u4fbf\u5b9c\u7684\u6708\u79df
  12. \n
  13. \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
  14. \n
\n

\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

\n

\u540c\u6b65\u53d1\u8868\u4e8e\u6211\u7684 blog

\n", "date_published": "2024-08-27T03:25:31+00:00", "title": "\u4e16\u754c\u4e0a\u6700\u597d\u7684 serverless \u5e73\u53f0\uff01", "id": "t/1068087" }, { "author": { "url": "member/shendaowu", "name": "shendaowu", "avatar": "https://cdn.v2ex.com/avatar/6fa4/0f0c/233858_large.png?m=1771487434" }, "url": "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": "t/1064947", "date_published": "2024-08-14T07:49:40+00:00", "content_html": "\u6bd4\u5982\u8fd9\u4e2a\uff1a




\u70b9\u51fb\u56fe\u7247\u4f1a\u5728\u65b0\u7a97\u53e3\u6253\u5f00\uff0c\u7136\u540e\u4f1a 302 \u5230\u7f51\u9875\u3002

\u56fe\u8fd9\u91cc\u770b\u5230\u7684\uff1a t/1064815 \u3002

\u6ca1\u627e\u5230\u5408\u9002\u548c\u8282\u70b9\u3002\u8c37\u6b4c\u548c AI \u90fd\u4e0d\u6ee1\u610f\u3002" }, { "author": { "url": "member/heguangyu5", "name": "heguangyu5", "avatar": "https://cdn.v2ex.com/avatar/b740/e481/159374_large.png?m=1579242902" }, "url": "t/1064519", "title": "PHP \u7f16\u8bd1\u5668 BPC \u7f16\u8bd1 ThinkPHP8 + PHPUnit \u6d4b\u8bd5 \u7684\u89c6\u9891\u6765\u4e86", "id": "t/1064519", "date_published": "2024-08-13T01:22:19+00:00", "content_html": "

\u89c6\u9891\u6709\u70b9\u957f,1.5 \u500d\u901f\u770b\u4e5f\u6ca1\u95ee\u9898.

\n

\u4ece\u4e00\u4e2a\u65b0\u88c5\u597d\u7684 Ubuntu 24.04 Desktop \u7684\u865a\u62df\u673a\u5f00\u59cb:

\n
    \n
  1. \n

    composer + PHP \u8fd0\u884c\u9879\u76ee\u6ca1\u95ee\u9898

    \n
  2. \n
  3. \n

    \u53bb\u6389 composer \u8fd0\u884c\u9879\u76ee\u6ca1\u95ee\u9898

    \n
  4. \n
  5. \n

    PHP \u8dd1\u901a PHPUnit \u6d4b\u8bd5

    \n
  6. \n
  7. \n

    BPC \u7f16\u8bd1\u8dd1\u901a PHPUnit \u6d4b\u8bd5

    \n
  8. \n
  9. \n

    PHP \u73af\u5883\u4e0b\u9879\u76ee\u5404\u9879\u529f\u80fd\u6d4b\u8bd5\u6ca1\u95ee\u9898

    \n
  10. \n
  11. \n

    BPC \u7f16\u8bd1\u8fd0\u884c\u8d77\u6765\u9879\u76ee\u5404\u9879\u529f\u80fd\u6d4b\u8bd5\u6ca1\u95ee\u9898

    \n
  12. \n
\n

[ PHP \u7f16\u8bd1\u5668 BPC \u7f16\u8bd1 ThinkPHP8 + PHPUnit \u6d4b\u8bd5] https://www.bilibili.com/video/BV1Laece6Epr/?share_source=copy_web&vd_source=fb7701afa4e3c4faaffabbe49ab11ac2

\n" }, { "author": { "url": "member/heguangyu5", "name": "heguangyu5", "avatar": "https://cdn.v2ex.com/avatar/b740/e481/159374_large.png?m=1579242902" }, "url": "t/1064349", "title": "PHP \u7f16\u8bd1\u5668 BPC 7.3 \u53d1\u5e03,\u6210\u529f\u7f16\u8bd1 ThinkPHP8", "id": "t/1064349", "date_published": "2024-08-12T06:14:04+00:00", "content_html": "

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.

\n

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!

\n

\u5f7b\u5e95\u89e3\u51b3 PHP \u9879\u76ee\u7684\u4ea4\u4ed8\u95ee\u9898.

\n

\"How

\n
    \n
  1. \u5b98\u7f51 bpc.dev
  2. \n
  3. \u5b89\u88c5\u4f7f\u7528\u6587\u6863
  4. \n
\n

\u5199\u5728\u524d\u9762:

\n
    \n
  1. 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.
  2. \n
  3. ThinkPHP8 \u7684\u7f16\u8bd1\u53ea\u662f\u4e00\u4e2a\u53ef\u884c\u6027\u9a8c\u8bc1,\u8bf7\u52ff\u7528\u4e8e\u751f\u4ea7\u73af\u5883.
  4. \n
\n

1. \u4e86\u89e3 ThinkPHP

\n

\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.

\n

\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.

\n

\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.

\n

2. \u8fc1\u79fb OurBlog \u5230 ThinkPHP

\n

\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 OurBlog,\u867d\u7136\u529f\u80fd\u5f88\u7b80\u5355,\u4f46\u57fa\u672c\u7684 CURD \u90fd\u6d89\u53ca\u5230\u4e86,\u6d4b\u8bd5\u4e5f\u975e\u5e38\u5b8c\u6574.

\n

\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.

\n

\u4e00\u756a\u6298\u817e\u4e4b\u540e,\u8fc1\u79fb\u6210\u529f\u4e86! \u6e90\u7801\u89c1: bpc-thinkphp8-ourblog

\n

3. BPC \u7f16\u8bd1: \u7406\u6e05\u4f9d\u8d56

\n

\u5728\u4f7f\u7528 composer \u521b\u5efa ThinkPHP \u9879\u76ee\u65f6,\u53ef\u4ee5\u770b\u5230\u4e00\u4e2a ThinkPHP8 \u9879\u76ee\u6709\u4ee5\u4e0b\u4f9d\u8d56:

\n
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
\n

\u8fdb\u4e00\u6b65\u5730,\u8dd1\u901a OurBlog \u6d4b\u8bd5\u7528\u4f8b, \u53ea\u9700\u8981\u641e\u5b9a 3 \u4e2a\u4f9d\u8d56\u5c31\u53ef\u4ee5\u4e86:

\n
    \n
  1. psr/simple-cache (3.0.0)
  2. \n
  3. topthink/think-helper (v3.1.6)
  4. \n
  5. topthink/think-orm (v3.0.20)
  6. \n
\n

\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:

\n
    \n
  1. psr/container (2.0.2)
  2. \n
  3. psr/http-message (1.1)
  4. \n
  5. psr/log (3.0.0)
  6. \n
  7. topthink/framework (v8.0.3)
  8. \n
\n

\u7531\u4e8e topthink/framework \u548c think-orm \u91cc\u90fd\u5305\u542b\u4e86 think\\Facade \u548c think\\Exception , \u9700\u8981\u628a think-orm/stubs \u72ec\u7acb\u51fa\u6765, \u518d\u52a0\u4e0a ourblog \u9879\u76ee\u672c\u8eab,\u4e00\u5171 9 \u4e2a repo, \u89c1\u8fd9\u91cc.

\n

4. BPC \u7f16\u8bd1: \u8c03\u6574\u4ee3\u7801

\n

\u8981\u60f3\u4e00\u884c\u4ee3\u7801\u4e0d\u52a8\u5c31\u80fd\u7f16\u8bd1\u6210\u529f,\u51e0\u4e4e\u662f\u4e0d\u53ef\u80fd\u7684.

\n

\u4ee3\u7801\u8c03\u6574\u4e3b\u8981\u96c6\u4e2d\u5728 3 \u4e2a\u65b9\u9762:

\n
    \n
  1. \u8bed\u6cd5: bpc \u4e0d\u652f\u6301\u7684\u8bed\u6cd5\u53ef\u4ee5\u901a\u8fc7 phptobpc \u505a\u8f6c\u6362, \u8f6c\u6362\u4e5f\u4e0d\u652f\u6301\u7684,\u5c31\u9700\u8981\u624b\u52a8\u8c03\u6574\u4ee3\u7801\u4e86.
  2. \n
  3. \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 is_file/is_dir/file_exists/glob \u6765\u5224\u65ad,\u8981\u6362\u7528 bpc \u81ea\u5df1\u7684\u4e13\u6709\u51fd\u6570.
  4. \n
  5. Reflection: bpc \u4e0d\u652f\u6301 Reflection,\u4f7f\u7528 Reflection \u5b9e\u73b0\u7684\u529f\u80fd\u8981\u8c03\u6574\u6210 bpc \u7684\u65b9\u5f0f.
  6. \n
\n

\u4ee3\u7801\u8c03\u6574\u7684\u7ec6\u8282\u53ef\u4ee5\u67e5\u770b\u6bcf\u4e2a repo \u7684 commit \u5386\u53f2.

\n

5. \u8fd0\u884c

\n
    \n
  1. \u521b\u5efa\u6570\u636e\u5e93
  2. \n
  3. \u8fd0\u884c tp8-ourblog-althttpd-ubuntu-24.04-amd64
  4. \n
\n

\u8be6\u89c1: bpc-thinkphp8-ourblog release v0.1

\n

\u540e\u8fb9\u53ef\u4ee5\u51fa\u4e2a\u89c6\u9891\u6765\u6f14\u793a\u4e00\u4e0b\u6574\u4e2a\u7f16\u8bd1\u8fd0\u884c\u7684\u8fc7\u7a0b.

\n" } ] } ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86