Hyperf基礎教程
前提說明
本教程適用於新手、老手,也適用於任何作業系統,包括Windows、linux、MacOS
介紹
Hyperf 是基於 Swoole 4.4+
實現的高性能、高靈活性的 PHP 協程框架,內置協程伺服器及大量常用的組件,性能較傳統基於 PHP-FPM
的框架有質的提升,提供超高性能的同時,也保持著極其靈活的可擴展性,標準組件均基於 PSR 標準 實現,基於強大的依賴注入設計,保證了絕大部分組件或類都是 可替換
與 可復用
的。
框架組件庫除了常見的協程版的 MySQL 客戶端
、Redis 客戶端
,還為您準備了協程版的 Eloquent ORM
、WebSocket 服務端及客戶端
、JSON RPC 服務端及客戶端
、GRPC 服務端及客戶端
、Zipkin/Jaeger (OpenTracing) 客戶端
、Guzzle HTTP 客戶端
、Elasticsearch 客戶端
、Consul 客戶端
、ETCD 客戶端
、AMQP 組件
、Apollo 配置中心
、阿里雲 ACM 應用配置管理
、ETCD 配置中心
、基於令牌桶演算法的限流器
、通用連接池
、熔斷器
、Swagger 文檔生成
、Swoole Tracker
、視圖引擎
、Snowflake 全局 ID 生成器
等組件,省去了自己實現對應協程版本的麻煩。
Hyperf 還提供了 基於 PSR-11 的依賴注入容器
、註解
、AOP 面向切面編程
、基於 PSR-15 的中間件
、自定義進程
、基於 PSR-14 的事件管理器
、Redis/RabbitMQ 消息隊列
、自動模型快取
、基於 PSR-16 的快取
、Crontab 秒級定時任務
、國際化
、Validation 表單驗證器
等非常便捷的功能,滿足豐富的技術場景和業務場景,開箱即用。
安裝
先看下官方的文檔說明
Hyperf 對系統環境有一些要求,僅可運行於 Linux 和 Mac 環境下,但由於 Docker 虛擬化技術的發展,在 Windows 下也可以通過 Docker for Windows 來作為運行環境,通常來說 Mac 環境下,我們更推薦本地環境部署,以避免 Docker 共享磁碟緩慢導致 Hyperf 啟動速度慢的問題。 hyperf\hyperf-docker 項目內已經為您準備好了各種版本的 Dockerfile ,或直接基於已經構建好的 hyperf\hyperf 鏡像來運行。 當您不想採用 Docker 來作為運行的環境基礎時,您需要確保您的運行環境達到了以下的要求: PHP >= 7.2 Swoole PHP 擴展 >= 4.4,並關閉了 Short Name OpenSSL PHP 擴展 JSON PHP 擴展 PDO PHP 擴展 (如需要使用到 MySQL 客戶端) Redis PHP 擴展 (如需要使用到 Redis 客戶端) Protobuf PHP 擴展 (如需要使用到 gRPC 服務端或客戶端)
可見,如果你打算再Windows上進行開發的話,那你可能會遇到一些困難,比如得裝一個docker for windows或者裝個虛擬機,由於有一部分win10系統是家庭版的,裝docker for windows會遇到一些奇奇怪怪的問題,筆者建議不要採用這種方法
下面我將採用三種方法快速上手Hyperf
1、原生安裝
適用範圍:如果你是新手,你從來沒有自己手動裝過PHP環境,也沒裝過PHP相關擴展,你可以試試看這種方法,不過你得有耐心,因為你會遇到一系列奇奇怪怪的問題
難度指數:五星
2、使用docker安裝
適用範圍:如果你已經手動安裝過PHP,配置過PHP環境以及相關擴展,想使用docker熟悉下,你可以試試看這種方式
難度指數:四星
3、docker-compose
適用範圍:如果你有一定的docker操作經驗,你可以使用這種一步到位的方法快速部署一個Hyperf項目
難度指數:三星
Tips:Linux或者MacOS用戶可以跳過下面安裝vmware虛擬機這一步
Windows用戶安裝 Vmware 和 Centos7(筆者用的是GUI版的Centos):
1、安裝 Vmware 以及安裝 Centos7,流程可以參考這位部落客的文章,參考
2、配置一個共享文件夾,有什麼作用呢,就是把你 Windows 上你的開發的項目映射到這台 Centos 虛擬機上,參考
3、配置虛擬機開機自動啟動掛載腳本,目的是自動掛載上面的共享文件夾,不用自己手動操作,參考
快速開始
這裡使用的是Hyperf的骨架項目,Github地址在這裡
一、原生安裝
原生安裝的話,需要你的虛擬機要裝有
- PHP(7.2以上版本)
- Swoole PHP 擴展 >= 4.4,並關閉了
Short Name
- OpenSSL PHP 擴展
- JSON PHP 擴展
- PDO PHP 擴展 (如需要使用到 MySQL 客戶端)
- Redis PHP 擴展 (如需要使用到 Redis 客戶端)
- Protobuf PHP 擴展 (如需要使用到 gRPC 服務端或客戶端)
- 安裝 Composer
1. PHP安裝
安裝教程可以參考這裡,如果遇到編譯錯誤的問題,參考這裡,配置PHP命令參考這裡
PS:如果執行「php -v」版本變成5.X,那可能是你之前裝過其他版本了,參考這裡
2. Swoole擴展安裝,OpenSSL、JSON、Redis等也同理,注意,裝之前運行”php -m”查看,沒有的話再安裝
Swoole參考這裡,JSON參考這裡,OpenSSL參考這裡,Redis參考這裡
PS:其他擴展看你自己項目需要,GD庫參考這裡,zip參考這裡,fileinfo參考這裡
3. 安裝composer
參考這裡
OK,弄完上面這裡,基本上環境就差不多了,如果遇到安裝報錯的話,應該是安裝PHP那部分會出錯的比較多,其他的很少出問題,下面使用Composer把骨架項目弄一下
在虛擬機的共享文件夾下面找個地方,運行下面命令,將會創建一個Hyperf的骨架項目,類似於一個啥都沒有的Demo
# composer create-project hyperf/hyperf-skeleton
安裝過程中可能需要一些時間,然後進入到項目裡面,運行下面命令啟動項目
# php bin/hyperf.php start
這樣,項目就啟動好了,如果沒報錯的話到這裡就OK了,然後是測試,有兩種方式,一種是瀏覽器打開://localhost:9501,另外一種是curl
# curl localhost:9501 //或者 # curl 0.0.0.0:9501 //或者 # curl 127.0.0.1:9501
Windows系統要怎麼開發呢,還記得上面共享了一個文件夾嗎,直接打開那個共享文件夾就會看到剛剛創建的項目,然後用你的編譯器打開進行碼碼碼就行了
由於Hyperf是持久化的 CLI 框架,當您修改完您的程式碼後,通過 CTRL + C
終止當前啟動的進程實例,並重新執行 php bin/hyperf.php start
啟動命令即可。
你也可以去Github上把這個項目的程式碼拉下來,運行compose install安裝相應的擴展,再啟動
二、使用docker安裝
前提:既然要用docker安裝,那你就得裝上docker命令,參考docker官方的文檔進行安裝即可
一些概念說明:
1、vmware虛擬機:這個是windows用戶在vmware上裝的虛擬機,比如上面的centos
2、docker容器:這個是在centos上運行docker run命令啟動的虛擬機
3、查看docker鏡像命令:docker imgaes
4、查看所有docker容器命令:docker ps -a
方法一:參考官方的安裝方式
# Windows用戶要注意了,由於這個是在centos上運行的,下面的主機指的是centos
# 下載並運行 hyperf/hyperf 鏡像,並將鏡像內的項目目錄綁定到宿主機的 /tmp/skeleton 目錄 docker run -v /tmp/skeleton:/hyperf-skeleton -p 9501:9501 -it --entrypoint /bin/sh hyperf/hyperf:7.2-alpine-cli # 鏡像容器運行後,在容器內安裝 Composer wget https://github.com/composer/composer/releases/download/1.8.6/composer.phar chmod u+x composer.phar mv composer.phar /usr/local/bin/composer # 將 Composer 鏡像設置為阿里雲鏡像,加速中國下載速度 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer # 通過 Composer 安裝 hyperf/hyperf-skeleton 項目 composer create-project hyperf/hyperf-skeleton # 進入安裝好的 Hyperf 項目目錄 cd hyperf-skeleton # 啟動 Hyperf php bin/hyperf.php start
方法二:
其實上面的方式有點繁瑣,看到骨架項目裡面有一個Dockerfile文件,我們可以做一個鏡像來處理
Dockerfile文件的內容,有沒有很熟悉,其實就是上面那一塊docker安裝內容的整理,這裡是把這些做成一個鏡像
# Default Dockerfile # # @link https://www.hyperf.io # @document https://doc.hyperf.io # @contact [email protected] # @license https://github.com/hyperf-cloud/hyperf/blob/master/LICENSE FROM hyperf/hyperf:7.2-alpine-v3.9-cli LABEL maintainer="Hyperf Developers <[email protected]>" version="1.0" license="MIT" ## # ---------- env settings ---------- ## # --build-arg timezone=Asia/Shanghai ARG timezone ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \ COMPOSER_VERSION=1.9.1 \ APP_ENV=prod # update RUN set -ex \ && apk update \ # install composer && cd /tmp \ && wget https://github.com/composer/composer/releases/download/${COMPOSER_VERSION}/composer.phar \ && chmod u+x composer.phar \ && mv composer.phar /usr/local/bin/composer \ # show php version and extensions && php -v \ && php -m \ # ---------- some config ---------- && cd /etc/php7 \ # - config PHP && { \ echo "upload_max_filesize=100M"; \ echo "post_max_size=108M"; \ echo "memory_limit=1024M"; \ echo "date.timezone=${TIMEZONE}"; \ } | tee conf.d/99-overrides.ini \ # - config timezone && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \ && echo "${TIMEZONE}" > /etc/timezone \ # ---------- clear works ---------- && rm -rf /var/cache/apk/* /tmp/* /usr/share/man \ && echo -e "\033[42;37m Build Completed :).\033[0m\n" WORKDIR /opt/www # Composer Cache # COPY ./composer.* /opt/www/ # RUN composer install --no-dev --no-scripts COPY . /opt/www RUN composer install --no-dev -o EXPOSE 9501 ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"]
既然有Dockerfile,我們直接吧這個Dockerfile做成一個鏡像吧
做鏡像的命令是:docker build -t 鏡像名:版本號 . PS:.表示最後的Dockerfile文件的位置,可以為絕對路徑 eg:docker build -t dev:1.0 .
做完鏡像後
運行 docker images看看你創建的鏡像
然後就可以啟動了
啟動的命令說明:docker run -v 主機卷:目標卷 -p 主機埠:目標埠 鏡像名:版本號 eg:docker run -v /data/:/opt/www -p 9501:9501 dev:1.0
查看docker日誌,加上-f表示持續查看 docker logs -f 容器id
查看所有的容器
docker ps -a
記得你打包鏡像的時候使用的鏡像名跟版本號要跟後面啟動的命令用的鏡像名和版本號要保持一致
題外話,如果我想讓這個docker容器跟另外一個docker容器,比如redis,要進行通訊,要怎麼做呢?參考這裡
兩個容器相互訪問,使用--link eg:docker run -v /data/:/opt/www -p 9501:9501 --link xxx1:redis xxx2
三、docker-compose
前提:安裝docker-compose,參考這裡
安裝完docker-compose後,在centos虛擬機任何地方創建一個docker-compose.yml文件
version: '2.0' services: hyperf-test: container_name: hyperf-test hostname: hyperf-test restart: always image: dev:1.0 ports: - 9501:9501 expose: - 9501 volumes: - /mnt/hgfs/hyperf-test/:/opt/www
說明:
1、”/mnt/hgfs/hyperf-test” 這個目錄是我掛載我windows主機到centos虛擬機的地址,可以自由換成你自己的地址
2、hyperf-test裡面的image使用的鏡像是第二步我們用Dockerfile做的鏡像
創建完成後呢,在這個docker-compose.yml文件的目錄下,參考下面命令把容器啟動、停止、重啟、刪除
// 啟動容器 # docker-compose up // 停止容器 # docker-compose stop // 重啟 # docker-compose restart // 停止容器並刪除 # docker-compose down
跟第二步一樣,如果我想讓兩個容器建立通訊,docker-compose.yml要怎麼寫呢
version: '2.0' services: redis2: image: redis container_name: redis2 hostname: redis2 restart: always command: --appendonly yes ports: - 6379:6379 expose: - 6379 privileged: true volumes: - /data/redis_data:/data hyperf-test: container_name: hyperf-test hostname: hyperf-test restart: always image: dev:1.0 ports: - 9501:9501 external_links: - redis2 links: - redis2:redis depends_on: - redis2 expose: - 9501 volumes: - /mnt/hgfs/hyperf-test/:/opt/www
說明:
1、把redis的配置也寫上
2、使用link關聯兩個容器
3、上面其實啟動了兩個容器,一個是redis,另外一個是hyperf,並且將兩者建立一個連接
其中,由於redis使用掛載的方法,不會因為重啟丟失數據,所以得先在主機目錄/data/redis_data建好文件並設置好許可權,如果後面啟動再次出現許可權問題:
- 關閉SELinux,執行「setenforce 0」
- docker-compose加上「privileged: true」
- docker run 加上「–privileged=true」
docker-compose link使用方法參考這裡
參考資料