PHP每次的每次請求結束, 都會釋放掉執行中建立的所有資源。這樣有一個很大的好處:PHP程序員基本不用費力去考慮資源釋放的問題,諸如內存,IO句柄,數據庫連接等,請求結束時PHP將全部釋放。PHP程序員幾乎不用關心內存釋放的問題,也很難寫出內存泄露的程序。這讓PHP變得更加簡單容易上手, 直抒心意。但是也帶來了一個壞處:PHP很難在請求間復用資源, 類似PHP框架這種耗時的工作, 每次請求都需要反復做——即使每次都在做同樣的事情。也正因為如此,在PHP發展過程中,關於是否使用框架的爭論也從未停止過。
Stone主要優化的就是這個問題。 在框架資源初始化結束后再開啟一個FastCGI服務,這樣, 新的請求過來是直接從資源初始化結束后的狀態開始,避免每次請求去做資源初始化的事情。所以, 本質上, Stone運行時是常駐內存的,它和PHP-FPM一樣,是一個FastCGI的實現,不同的是, FPM每次執行請求都需要重新初始化框架, Stone直接使用初始化的結果。
同樣,事情總是有好有壞。壞處是:PHP編程變得更難了, 你需要考慮內存的釋放,需要關心PHP如何使用內存。甚至, 你需要了解使用的框架,以免『不小心』寫出讓人『驚喜』的效果。同時, PHP的調試變得更難, 因為每次修改程序后需要重啟進程才能看到效果。事實上開發Stone時針對這方面做了不少工作。好處是:程序的性能得到極大的提高。 當然, 客觀上的一些利好因素是: PHP的內存回收已經相當穩定和高效, Swoole穩定性已經在相當多的項目中得到驗證,Laravel代碼質量相當高。
按照Laravel官方文檔安裝laravel,如果已經安裝可以跳過
composer安裝stone內核
composer require stone/kernel:dev-master
編輯config / app.php,添加Provider
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
// 省略很多行
/*
* Package Service Providers...
*/
Stone\StoneServiceProvider::class,
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
],
編輯app / Console / Kernel.php,添加新命令
protected $commands = [
\Stone\Console\Commands\StoneServer::class,
];
Stone的安裝已經完成,正常情況下stone:server的命令應該可以正常執行了
php ./artisan stone:server --help
Usage:
stone:server [options]
Options:
--debug
--start
--reload
--stop
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
--env[=ENV] The environment the command should run under
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Help:
A FastCGI server bases on swoole and laravel
下面我們繼續,讓服務器運行起來,首先需要設置一些服務器的參數,我們需要新建一個config / stone.php
<?php
return [
'server' => [
'user' => 'www-data', //運行用戶,一般和php-fpm運行用戶相同
'group' => 'www-data', //運行組,同上
'domain' => '/var/run/stone-server-fpm.sock', // Unix域套接字地址,使用與nginx進程通信,推薦保持可用,如果系統不支持也可以是ip地址
'port' => 9101, // 端口
'handler' => 'App\Servers\Handler', //請求處理器,一個類名
'pid' => '/var/run/stone.pid', //進程文件
]
];
建立Handler,新建app / Servers / Handler.php
<?php namespace App\Servers;
use Stone\Contracts\RequestHandler;
use Response;
class Handler implements RequestHandler
{
public function process()
{
return Response::make('hello, stone server!');
}
public function onWorkerStart()
{
}
public function handleException($e)
{
}
}
啟動服務器,正常情況下會顯示一個ok
php artisan swoole:http stop
php artisan swoole:http start
sudo php artisan stone:server --stop
sudo php artisan stone:server --start
訂閱:
文章 (Atom)
熱門文章
-
專案概述:問題陳述與核心目標 在過去的企業營運中,經常面臨大量重複性、耗時且容易出錯的手動流程,例如每月耗費超過 200 人時的財務報表生成,以及需大量人力投入的客戶服務常見問答處理。這些挑戰不僅導致效率低落,也排擠了團隊投入更高價值工作的時間。 為了解決此痛點,本專案設計並...
-
要在 Windows 11 底下開發一個基於 XAMPP + Waitress + FastAPI 的高併發爬蟲系統,同時使用 MySQL 和 Redis,這是一個相當複雜但也非常有挑戰性的任務。下面我會將整個開發流程拆解成幾個主要部分,並提供詳細的步驟和注意事項。 重要提醒: ...
-
在資料庫設計中, 正規化 (Normalization) 和 反正規化 (Denormalization) 是兩種截然不同的策略,各有其優缺點,通常需要在實際應用場景中權衡選擇。 一、正規化 (Normalization) 定義 正規化是一套系統性的方法,用於設計關聯式資...
-
Nginx 與 PHP-FPM:FastCGI 協議實戰與容器化部署優化 在高並發的微服務時代,高效的 Web 伺服器與後端應用程式協同工作是系統效能的基石。Nginx 作為最受歡迎的網頁伺服器之一,與 PHP-FPM(FastCGI Process Manager)的組合堪稱經...
-
前言 當您的 Laravel 應用程式從初期的成長期邁入高流量階段時,單一伺服器架構將無法滿足龐大的併發請求,進而導致服務變慢甚至中斷。本指南旨在提供一個全面的技術路線圖,說明如何利用 Amazon Web Services (AWS) 的各種彈性服務,將您的 Laravel...
-
正規化說明 正規化是在資料庫中組織資料的程序。 其中包括建立資料表,以及在這些資料表之間根據規則建立關聯性,這些規則的設計目的是:透過刪除重複性和不一致的相依性,保護資料並讓資料庫更有彈性。 重複的資料會浪費磁碟空間,並產生維護方面的問題。 如果必須變更現有資料,並且該...
-
從零開始:使用 FastAPI、MySQL 和 Docker 打造你的第一個電商購物車應用 引言: 哈囉,各位程式碼愛好者!你是否曾經想過要打造一個自己的網路應用程式,卻不知道從何開始?特別是對 Python 有興趣的初學者,常常會被複雜的 Web 框架和部署流程嚇到。別擔心!今...
-
Web 前後端分離:現代應用程式架構的必然選擇? 在當代 Web 應用程式開發中,「前後端分離」已成為一種主流的架構模式。它不僅改變了開發團隊的工作流程,也對應用程式的效能、可擴展性、維護性和用戶體驗產生了深遠影響。本文將深入探討前後端分離的意義、其核心優勢、潛在挑戰以及在何...
-
用 Laravel 和 Vue3 打造 AI 虛擬人互動系統:從零開始的專案骨架與 RAG 實踐 專案背景與目標 隨著生成式 AI 的蓬勃發展,我們能以更低成本、更有效率的方式來打造具備互動能力的虛擬角色。本專案旨在提供一個完整的 AI 虛擬人互動管理系統,讓開發者能夠快速建立一...
-
PetJoyEcommerce 技術架構深度解析:從開發到部署到未來擴展的現代全端實踐 在當今數位時代,一個高效能、可擴展且易於維護的電商平台是成功的關鍵。 PetJoyEcommerce 專案作為一個最小可行性產品 (MVP),集結了多項現代技術,為開發者提供一個絕佳的學...