[{"data":1,"prerenderedAt":65},["ShallowReactive",2],{"article-109":3},{"code":4,"msg":5,"data":6,"count":14},200,"查询成功",{"id":7,"title":8,"keywords":9,"description":10,"category_id":11,"content":12,"body_html":13,"thumb_up":14,"clicks":15,"sort":14,"remark":13,"status":16,"is_open":16,"is_deleted":14,"is_top":16,"is_recommend":16,"create_time":17,"update_time":18,"image_id":19,"url":13,"member_id":14,"cate_name":20,"prev":21,"next":24,"tags":27,"words":36,"read_time":37,"comments":14,"cover":38,"relevant":39},109,"thinkphp6加swoole高并发上传图片","thinkphp,swoole,高并发,上传","安装Swoole扩展和think-swoole包，配置Swoole服务器参数，调整上传控制器逻辑以适应协程，优化文件存储和处理流程，加强安全性措施，并进行充分的测试和性能调优",2,"在ThinkPHP6中结合Swoole实现高并发图片上传，可以通过以下步骤优化性能和并发处理能力：\n\n---\n\n### **1. 环境准备**\n#### 安装Swoole扩展\n```bash\npecl install swoole\n# 或在Ubuntu\u002FDebian中\nsudo apt-get install php-swoole\n```\n确保`php.ini`中启用扩展：\n```ini\nextension=swoole.so\n```\n\n#### 安装ThinkPHP6的Swoole适配包\n```bash\ncomposer require topthink\u002Fthink-swoole\n```\n\n---\n\n### **2. 配置Swoole服务器**\n修改`config\u002Fswoole.php`，调整参数以支持高并发：\n```php\nreturn [\n    'server' => [\n        'host' => '0.0.0.0',\n        'port' => 9501,\n        'options' => [\n            'worker_num' => swoole_cpu_num() * 2, \u002F\u002F 工作进程数\n            'enable_coroutine' => true,           \u002F\u002F 开启协程\n            'max_request' => 1000,                \u002F\u002F 进程最大请求数\n            'upload_max_filesize' => 50 * 1024 * 1024, \u002F\u002F 最大上传文件50MB\n            'package_max_length' => 100 * 1024 * 1024, \u002F\u002F 请求包最大100MB\n        ],\n    ],\n];\n```\n\n---\n\n### **3. 修改上传逻辑适配Swoole协程**\n#### 控制器调整（`app\u002Fcontroller\u002FUpload.php`）\n```php\npublic function upload()\n{\n    $files = request()->file('image');\n    $results = [];\n    \n    \u002F\u002F 使用协程并行处理每个文件\n    $coroutines = [];\n    foreach ($files as $key => $file) {\n        $coroutines[] = Coroutine::create(function () use ($file, $key, &$results) {\n            try {\n                $validate = ['size' => 50*1024*1024, 'ext' => 'jpg,png,gif'];\n                $info = $file->validate($validate)->move('.\u002Fuploads');\n                \n                if ($info) {\n                    $results[$key] = ['path' => $info->getSaveName()];\n                } else {\n                    $results[$key] = ['error' => $file->getError()];\n                }\n            } catch (\\Throwable $e) {\n                $results[$key] = ['error' => $e->getMessage()];\n            }\n        });\n    }\n    \n    \u002F\u002F 等待所有协程完成\n    Coroutine::join($coroutines);\n    \n    return json(['data' => $results]);\n}\n```\n**关键点：**\n- **协程并行处理**：每个文件上传使用独立协程，避免阻塞。\n- **共享数据安全**：通过引用传递`$results`，需注意协程间数据竞争，此处使用数组键确保顺序。\n\n---\n\n### **4. 使用Swoole异步文件写入**\n#### 异步存储文件（替代`move`方法）\n```php\nuse Swoole\\Coroutine\\System;\n\u002F\u002F ...\n$filePath = '.\u002Fuploads\u002F' . uniqid() . '.' . $file->extension();\n\u002F\u002F 异步写入文件\n$content = $file->getContent();\nSystem::writeFile($filePath, $content);\n$results[$key] = ['path' => $filePath];\n```\n**优势：**\n- 异步非阻塞IO提升并发吞吐量。\n- 避免传统`move`方法可能存在的阻塞问题。\n\n---\n\n### **5. 结合云存储进一步优化**\n#### 配置阿里云OSS异步上传\n```php\nuse OSS\\OssClient;\nuse Swoole\\Coroutine;\n\n\u002F\u002F 在协程中异步上传到OSS\n$ossClient = new OssClient(\n    config('oss.accessKeyId'),\n    config('oss.accessKeySecret'),\n    config('oss.endpoint')\n);\n\nCoroutine::create(function () use ($ossClient, $filePath, $object) {\n    $ossClient->uploadFile(config('oss.bucket'), $object, $filePath);\n});\n```\n\n---\n\n### **6. 性能优化配置**\n#### 调整Swoole参数（`config\u002Fswoole.php`）\n```php\n'options' => [\n    'worker_num' => 8,             \u002F\u002F 根据CPU核心数调整\n    'task_worker_num' => 4,         \u002F\u002F 异步任务进程\n    'buffer_output_size' => 32 * 1024 * 1024, \u002F\u002F 输出缓冲区\n    'max_coroutine' => 10000,       \u002F\u002F 最大协程数\n],\n```\n\n#### 使用连接池管理资源\n```php\n\u002F\u002F 数据库\u002FRedis连接池配置（避免协程间连接冲突）\n\\think\\Db::setConfig([\n    'conn_pool' => true, \u002F\u002F 启用连接池\n    'pool_size' => 50,   \u002F\u002F 连接池大小\n]);\n```\n\n---\n\n### **7. 压力测试与监控**\n#### 使用`wrk`进行并发测试\n```bash\nwrk -t4 -c100 -d30s http:\u002F\u002Flocalhost:9501\u002Fupload\n```\n**参数说明：**\n- `-t4`：4个线程\n- `-c100`：100个并发连接\n- `-d30s`：持续30秒\n\n#### 监控Swoole服务状态\n通过内置HTTP接口查看状态：\n```bash\ncurl http:\u002F\u002Flocalhost:9501\u002Fstats\n```\n输出示例：\n```json\n{\n    \"start_time\": 1621567890,\n    \"worker_num\": 8,\n    \"coroutine_num\": 45,\n    \"request_count\": 12345\n}\n```\n\n---\n\n### **8. 常见问题解决**\n#### **问题1：上传大文件内存溢出**\n- **原因**：默认Swoole将整个请求体加载到内存。\n- **解决**：启用临时文件存储：\n  ```php\n  'options' => [\n      'http_parse_post' => true,\n      'upload_tmp_dir' => '\u002Ftmp\u002Fswoole_uploads', \u002F\u002F 指定临时目录\n  ],\n  ```\n\n#### **问题2：协程间数据污染**\n- **现象**：`$results`数组内容错乱。\n- **解决**：使用协程本地存储（Coroutine-Local Storage）：\n  ```php\n  use Swoole\\Coroutine;\n  $results = new Coroutine\\Channel();\n  \n  Coroutine::create(function () use ($results) {\n      \u002F\u002F 处理文件...\n      $results->push($result);\n  });\n  \n  $data = [];\n  while ($result = $results->pop()) {\n      $data[] = $result;\n  }\n  ```\n\n---\n\n### **总结**\n通过Swoole协程特性，ThinkPHP6的图片上传并发能力可提升10倍以上。核心步骤：\n1. **环境配置**：安装Swoole扩展及适配包。\n2. **协程改造**：使用`Coroutine::create`并行处理每个文件。\n3. **异步IO优化**：利用`System::writeFile`或云存储SDK异步写入。\n4. **资源管理**：配置连接池和合理Swoole参数。\n5. **监控调优**：通过压力测试持续调整参数。 \n\n实际部署时需根据服务器硬件调整`worker_num`和`max_coroutine`，并确保文件存储服务（如OSS、NFS）具备高可用性。",null,0,57,1,"2025-05-22 00:40:19","2025-05-22 00:40:29",66,"PHP",{"id":22,"title":23},108,"PHP中使用cURL实现Get和Post请求的方法",{"id":25,"title":26},110,"FAdminAi开源系统",[28,31,33],{"id":29,"name":30},49,"ThinkPHP",{"id":32,"name":20},25,{"id":34,"name":35},86,"Swoole",2335,5,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002F20230407\u002Fe70ad72ca8f855e68e71fb0e124ede5a.jpeg",[40,45,50,55,60],{"id":41,"title":42,"create_time":43,"description":44},93,"PHP执行Python脚本解压，压缩文件夹操作","2020-08-06 14:59:05","PHP是有解压缩类文件的，但在实际项目中，用户方使用Python脚本压缩，很容易出现中文解压乱码，导致文件内容丢失的情况，本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法",{"id":46,"title":47,"create_time":48,"description":49},92,"PHP对图片的处理","2020-07-30 15:53:38","图片处理函数功能：缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色处理并保存历史记录的思路：当有图片有改动时自动生成一张新图片",{"id":51,"title":52,"create_time":53,"description":54},96,"PHP中字符串跟0做比较永远是true","2021-02-04 16:16:27","最近在项目中做数据对比的功能，发现一个特殊的情况，0跟任何字符串做比较永远返回true，特意了解了一下。",{"id":56,"title":57,"create_time":58,"description":59},13,"Win系统下配置PHP链接Oracle","2019-01-17 22:23:36","该文章内容主要介绍window系统下，php连接oracle的配置。",{"id":61,"title":62,"create_time":63,"description":64},103,"面向对象三大特性五大原则 + 低耦合高内聚[转载]","2021-10-31 23:18:58","面向对象的三大特性是\"封装、\"多态\"、\"继承\"，五大原则是\"单一职责原则\"、\"开放封闭原则\"、\"里氏替换原则\"、\"依赖倒置原则\"、\"接口分离原则\"。",1783431654202]