Workerman报错“preg_match() expects parameter 2 to be string”

云强同学_5131

云强同学_5131

2026-05-21

999人浏览

原创

该错误是因preg_match()第二个参数非字符串(如null、array)导致php报错,workerman中因异步特性易在http/ws解析、路由匹配等场景触发,需用is_string()校验或强制类型转换。

workerman报错“preg_match() expects parameter 2 to be string”

preg_match() expects parameter 2 to be string 是什么问题

这个错误不是 Workerman 自身抛出的,而是 PHP 的 preg_match() 函数在调用时,第二个参数(即待匹配的字符串)传入了非字符串类型(比如 null、array、int 或对象),PHP 直接报错中断执行。Workerman 作为常驻进程框架,一旦某次请求/回调中触发该错误且未捕获,就会导致当前 Worker 进程退出或连接异常。

常见触发位置包括:HTTP 请求体解析、WebSocket 消息处理、自定义路由匹配、中间件里对 $_GET / $_POST / $request->get() 等值直接丢给 preg_match() 做校验,而没做类型判断。

为什么在 Workerman 里特别容易踩这个坑

Workerman 的异步非阻塞特性会让变量生命周期和调试路径变得隐蔽,尤其以下场景高发:

ChatDev
ChatDev

ChatDev是一款AI智能体工具,面壁智能推出的AI智能体软件开发平台,使用自然语言即可创建软件。

下载
  • $request->post() 或 $request->get() 返回的是 array,但有人误以为某个键一定存在且是字符串,直接写成 preg_match('/^\d+$/', $request->get('id'))
  • WebSocket 收到的 $frame->data 可能是 binary(二进制数据)、null(如 ping/pong 帧),但代码默认当作 UTF-8 字符串处理
  • 使用 json_decode() 解析客户端数据后未检查返回值,当 JSON 格式错误时返回 null,后续仍传给 preg_match()
  • 路由正则匹配前,对 URI path 做了 urldecode() 或其他转换,结果得到 false(例如 urldecode('%'))

怎么快速定位和修复

先确认出错行号(看完整错误堆栈,重点找你自己的文件),然后围绕 preg_match() 调用点做三件事:

  • 检查第二个参数是否可能为非字符串:用 is_string() 或 !empty() + is_scalar() 做兜底
  • 所有来自网络输入的变量,一律先强制转字符串(谨慎!仅限明确需要字符串匹配的场景):(string)$value,但要注意 null → ''、array → 'Array' 可能引入逻辑 bug
  • 更安全的做法是提前过滤或拒绝异常输入:
// ❌ 危险写法
preg_match('/^\w+$/i', $request->get('username'));
<p>// ✅ 推荐写法
$username = $request->get('username');
if (!is_string($username) || $username === '') {
// 返回错误响应或跳过匹配
return;
}
preg_match('/^\w+$/i', $username);
</p>
  • 如果是在 WebSocket 中处理 $frame->data,务必先判断帧类型和数据类型:
    if ($frame->opcode === \Workerman\Protocols\Websocket::BINARY) {
      // 不适合 preg_match,考虑 unpack 或跳过
      return;
    }
    $data = $frame->data;
    if (!is_string($data)) {
      return;
    }
    

Workerman 环境下还要注意的兼容细节
  • Workerman 默认不开启 display_errors,错误可能只写日志不报给前端,务必检查 Worker::$logFile 或系统日志
  • 在 onMessage、onRequest 等回调里未用 try...catch 包裹业务逻辑时,这类 PHP Warning 会直接终止当前请求处理,但 Worker 进程本身不会崩——这点容易让人误判问题范围
  • PHP 8.0+ 对 preg_match() 的类型检查更严格,PHP 7.x 可能静默转字符串,升级后突然报错是常见现象

类型校验这一步,在 Webman、GatewayWorker 或纯 Worker 场景里都不能省;看似多写两行 is_string(),实际省去半天查日志和复现的时间。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9944

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5921

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2075

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3708

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4394

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3451

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4917

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3842

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11802

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习