easyswoole - 基于swoole扩展实现的一款高性能php框架

常見問題

如何處理靜態資源

Apache URl rewrite

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  # RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]  fcgi下無效
  RewriteRule ^(.*)$  http://127.0.0.1:9501/$1 [QSA,P,L]
   # 請開啟 proxy_mod proxy_http_mod request_mod
</IfModule>

Nginx URl rewrite

server {
    root /data/wwwroot/;
    server_name local.swoole.com;
    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        if (!-f $request_filename) {
             proxy_pass http://127.0.0.1:9501;
        }
    }
}

Swoole 靜態文件處理器

詳細請可查看 配置文件 章節

修改配置文件的 dev.php 或者 produce.php,實現 Swoole 對靜態文件進行處理。

<?php

return [
    // ...... 這里省略
    'MAIN_SERVER' => [
        // ...... 這里省略
        'SETTING' => [
            // ...... 這里省略

            # 設置處理 Swoole 靜態文件
            'document_root' => EASYSWOOLE_ROOT . '/Static/',
            'enable_static_handler' => true,
        ],
        // ...... 這里省略
    ],
    // ...... 這里省略
];

上述配置是假設你的項目根目錄有個 Static 目錄是用來放置靜態文件的。具體的使用可查看 https://wiki.swoole.com/#/http_server?id=document_root

關于跨域處理

在框架的初始化事件 initialize 事件 中進行注冊。

注冊示例代碼如下:

public static function initialize()
{
    date_default_timezone_set('Asia/Shanghai');

    // onRequest v3.4.x+
    \EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) {
        $origin = $request->getHeader('origin')[0] ?? '*';
        $response->withHeader('Access-Control-Allow-Origin', $origin);
        $response->withHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
        $response->withHeader('Access-Control-Allow-Credentials', 'true');
        $response->withHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, token');
        if ($request->getMethod() === 'OPTIONS') {
             $response->withStatus(\EasySwoole\Http\Message\Status::CODE_OK);
             return false;
        }
        return true;
    });
}

EasySwoole 3.4.x 版本之前:可在項目根目錄的 EasySwooleEvent.php 中看到 onRequestafterRequest 方法.

如何獲取 $HTTP_RAW_POST_DATA

$content = $this->request()->getBody()->__toString();
$raw_array = json_decode($content, true);

如何獲取客戶端 IP

舉例,如何在控制器中獲取客戶端 IP

// 真實地址
// 獲取連接的文件描述符
$fd = $this->request()->getSwooleRequest()->fd;
$ip = \EasySwoole\EasySwoole\ServerManager::getInstance()->getSwooleServer()->connection_info($fd);
var_dump($ip);

// header 地址,例如經過 nginx proxy 后
$ip2 = $this->request()->getHeaders();
var_dump($ip2);

HTTP 狀態碼總為500

自 swoole 1.10.x2.1.x 版本起,執行 http server 回調中,若未執行 response->end(),則全部返回 500 狀態碼

如何 setCookie

調用 response 對象的 setCookie 方法即可設置 cookiesetCookie 方法和原生 setcookie 用法一致。

$this->response()->setCookie('name', 'value');

更多操作可看 Response 對象

如何自定義 App 命名空間對應目錄

只需要修改項目根目錄的 composer.json 的自動加載的 App 命名空間對應的目錄即可,然后執行 composer dumpautolaod -o 注冊就行。

{
    // ... 這里省略
    "autoload": {
        "psr-4": {
            "App\\": "Application/"
        }
    }
}

如何啟用 Https

通常建議使用 Nginx 或者 Lb 來配置證書,將 https 請求解析為 http 反代到 swoole

如果你僅是測試使用,可以在配置文件 (dev.php 或者 produce.php) 中添加和修改以下配置來啟用https。

<?php

return [
    // ...... 這里省略
    'MAIN_SERVER' => [
        // ...... 這里省略
        'SOCK_TYPE' => SWOOLE_TCP | SWOOLE_SSL, // 默認是 SWOOLE_TCP
        'SETTING' => [
            'ssl_cert_file' => '證書路徑,僅支持.pem格式',
            'ssl_key_file' => '私鑰路徑',
        ]
        // ...... 這里省略
    ],
    // ...... 這里省略
];

詳細請可查看 配置文件 章節

DNS Lookup resolve timeout 錯誤

該錯誤一般存在于 http 客戶端并發調用時產生,原因是 dns 效率慢,導致多線程獲取 dns 時超時,包括不限于以下場景:

  • mysql host 設置為域名形式,并且設置最小連接高于 2(很難看到,一般是 10 才會偶爾報錯)
  • HTTPClient 多個協程同時并發
  • csp 并發編程 等

解決方法為:
在并發之前,預先使用 Swoole\Coroutine::gethostbyname('www.baidu.com'); 去查詢一次dns ipswoole 底層才會自動緩存該 ip

例如:

Swoole\Coroutine::gethostbyname('www.baidu.com');
for ($j = 0; $j < 100; $j++) {
    go(function () use ($j) {
        for ($i = 0; $i < 1000; $i++) {
            $client = new Swoole\Coroutine\Http\Client('www.baidu.com', 443, true);
            $client->get('/');
            if (empty($client->errMsg)) {
//var_dump($client->getBody());
            } else {
                var_dump($client->errMsg);
            }
        }
    });
}

CURL 發送 POST請求 EasySwoole 服務器端超時

  • 出現原因:CURL 在發送較大的 POST 請求(例如: 上傳文件)時會先發一個 100-continue 的請求,如果收到服務器的回應才會發送實際的 POST 數據。而 swoole_http_server(即 EasySwooleHttp 主服務) 不支持 100-continue,就會導致 CURL 請求超時。
  • 解決方法:

方法1:關閉 CURL100-continue,在 CURLHeader 中配置關閉 100-continue 選項。

示例代碼(php):

<?php
// 創建一個新cURL資源
$ch = curl_init();
// 設置URL和相應的選項
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:9501");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1); // 設置為POST方式
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); // 關閉 `CURL` 的 `100-continue`
curl_setopt($ch, CURLOPT_POSTFIELDS, array('test' => str_repeat('a', 800000)));// POST 數據
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

方法2:使用 Nginx 做前端代理,由 Nginx 處理 100-Continue(針對無法關閉 100-continue時)

http 服務中公共函數如何引入

很多開發小伙伴在開發過程中可能遇到疑惑,在 EasySwoole 怎么像 ThinkPHP 框架那樣引入自定義的公共函數,接下來簡單說明下引入方法,這邊推薦借助 composer 的自動加載機制 (Files)實現。

修改項目根目錄的 composer.json 文件的 autoload.files 選項,示例如下:

{
    // ... 這里省略
    "autoload": {
        // ... 這里省略
        "files": ["App/Common/functions.php"]
    }
}

然后新建文件 App\Common\functions.php,在 functions.php 中編寫自己的自定義函數,再在項目根目錄執行 composer dumpautoload 完成自動加載,就可以在框架的任意位置進行調用函數了。

示例如下:

<?php
// functions.php
if (!function_exists('helloEasySwoole')) {
    function helloEasySwoole()
    {
        echo 'Hello EasySwoole!';
    }
}

// ... 更多自定義函數

調用示例:

<?php
namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\Controller;

class Index extends Controller
{
    function index()
    {
        \helloEasySwoole();
    }
}

自定義函數都可以放在這個文件中。

主站蜘蛛池模板: 智能访客系统 - 来访登记系统_微信预约系统_人员出入管理系统_访客机_人脸识别系统门禁闸机 | 卧式球磨机_干法球磨机_尼龙球磨机-无锡市少宏粉体科技有限公司 卧螺离心机-固液分离机-台州春鼎机械制造有限公司 | 硫化剂|双马树脂|交联剂-宿迁志晟科技有限公司 | 学汽修_汽修学校_汽修学校哪家好-江西万通汽车学院官网 | 天津津腾,微孔滤膜,隔膜真空泵,针式过滤器-艾科仪器 | 射频微波_微波元器件_芯片_电源模块_Raychem_立维创展 | 烘干机|烘干房|网带烘干机|滚筒烘干机|炒货机-河南曼瑞通机械有限公司 | 两面针(江苏)实业有限公司-原两面针(扬州)酒店用品有限公司 | 做网站_网站建设_专业上海网站制作_网至普网站建设 | 吸附式干燥机|零气耗压缩热干燥机|无锡气净法工业技术有限公司【官网】 | 热熔胶涂布机-青岛三人行机械有限公司 | 纠偏系统厂家-迈欣机械| 平邑衡器厂--临沂衡器--电子汽车衡 -- 十佳知名品牌企业 | 智能电地暖_电地暖安装_电地暖价格-西安秦星暖通工程有限公司 | 弯箍机_钢筋弯箍机_全自动钢筋弯箍机_数控弯箍机-建科智能装备制造(天津)股份有限公司 | 实验室冷水机-冷却循环水系统-深圳市达沃西制冷设备厂 | 精品中文字幕在线观看,粉嫩av一区二区三区,最近中文字幕在线看免费视频,亚洲高清在线观看,日本一区二区视频手机免费看,国产黄色小视频,亚洲高清免费视频,国产精品一区二区欧美视频,亚洲人免费视频,亚洲视频在线观看免费,国产免费高清综合视频,中文字幕永久在线 | 吉安仁济医院「官网」吉安男科医院-吉安仁济男科医院靠谱吗-男性专科医院 | 精细筛-振动筛-滚筒筛-摇摆筛-平面回转筛-筛分机械设备-新乡德科筛分机械公司 | 山东荣利中石油机械有限公司 | 天津止回阀-止回阀报价/哪家好-天津蝶阀/进口阀门/通风蝶阀批发-闸阀阀门/球阀生产厂家-天津凯维斯阀门制造 | 浙江桥梁检测车出租_杭州桥检车出租_桥梁检测车出租_桥检车租赁_桥梁检测车租赁-广州众诚设备租赁有限公司 | 推荐|广佛一条龙高端茶到底有多香 | 企业网站模板_公司模板网站_网站整站源码 - 亿搜云全网营销平台 企业头条—优府网企业自媒体 | 西安泰富西玛电机有限公司总部-电机-高压电机-西玛电机-西安西玛电机-泰富西玛电机-西安电机厂-西玛电机销售 | 老照片修复,修复老照片,老旧照片翻新-老照片修复网 | 汽车智能防撞系统_智能刹车_77G毫米波雷达_麒云科技疲劳驾驶预警 | 实木中药柜,实木中药斗,木制中药柜,木制中药柜的价格,实木中草药柜,安国美佳中药柜厂家 | 重庆惠程信息科技股份有限公司 | 耐磨工业软管,PTFE耐腐蚀软管,耐磨喷砂胶管,超耐磨软管厂家,漯河利通液压管利通科技-耐磨工业软管,PTFE耐腐蚀软管,耐磨喷砂胶管,超耐磨软管厂家,漯河利通液压管利通科技 | 泊头市鸿海泵业有限公司--导热油泵,高温油泵,沥青保温泵,圆弧泵,齿轮油泵,高粘度泵,自吸离心油泵,罗茨油泵为主的专业生产厂家 | 衢州装饰公司_衢州装修公司_衢州创美装饰工程有限公司 - Powered by www.qzcmzs.com | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 深圳市翔洲宏科技有限公司| 液压支架配件|液压支架立柱|液压支架千斤顶|液压支架换向阀|液压支架乳化油|液压支架密封件-山东卓力生产厂家 | 涂料分散剂_水墨分散剂-厚洹化学水性色浆助剂厂家 | 南京文化墙设计公司,南京包装设计制作印刷,南京PPT设计公司,导视制作公司,企业logo设计 | 康明斯柴油发电机厂家-康明斯发电机(深圳)有限公司 | 小程序商城,_电商系统源码,直播商城定制开发电商系统源码,电商系统,java电商系统 | 三相干式变压器|三相隔离变压器|上海盖能电气有限公司官方网站|上海干式变压器生产厂家 | 蒸汽发生器-电加热蒸汽发生器、燃油蒸汽发生器、燃气蒸汽发生器设备厂家-诺贝思蒸汽发生器 |