oss php sdk基于swoole的简单HTTP服务器实现

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000 次 1年
简介: oss php sdk集成swoole,并通过nginx反向代理实现异步高并发

前言

最近听说有个东东重新定义了"世界上最好的语言",激动一查原来大名叫swoole,
你看下它的官方定义:

PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
Swoole2.0支持了类似Go语言的协程,可以使用完全同步的代码实现异步程序。PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步。

你再看它有多牛:
swoole_good

上面的引用的都来自人民日报噢不,是官方定义,不管你信不信,反正我有点方。。。
既然它辣么好,那oss php sdk必须支持啊(没错我只是想告诉你它怎么用,oss php sdk没毛病,别上来就歧视俺们是残疾人)。
废话说那么多,干货还没见到。下面就说说oss php sdk怎么和swoole搞基。

一、安装swoole

别看人民日报上说的swoole根正苗红的扩展,我简单调查下它
php -m | grep swoole
尽然为空、为空、为空。。。所以要自行安装swoole,如果你和我一样安装了php7和pecl,你可以直接,
pecl install swoole
然后用php -info | grep php.ini查看Loaded Configuration File(只有它能让php扩展干活)具体是哪个,对于我的环境是/etc/php/7.0/cli/php.ini这个文件,你需要
vim /etc/php/7.0/cli/php.ini
然后添加
extension = "swoole.so"

或者你可以自行编译安装swoole(什么?不会?google一搜满屏都是方法),只要和下面一样我们就可以继续玩。
swoole_grep_ok

二、玩转oss php sdk

既然是在oss php sdk中玩转swoole,那必须要把php sdk搞起呀。方法很简单,方法如下:

  • git clone https://github.com/aliyun/aliyun-oss-php-sdk.git #从oss php sdk的代码地址下载代码
  • cd aliyun-oss-php-sdk/
  • 配置好samples/Config.php #相信你肯定不是第一次用oss
  • php sample/Swoole.php #运行我们提前放好的sample程序
  • curl 127.0.0.1:9503
    是不是出现了 Hello Swoole

curlswoole
这就证明swoole和oss php sdk正式搞在一起了。

三、设置nginx做反向代理

前面已经可以通过swoole访问oss了,但在服务器端更普遍的做法是使用nginx作为前端代理,通过nginx反向代理服务器访问我们起的swoole server。
具体的步骤:(已安装nginx的自觉跳过)

nginx

如果是这样说明nginx正常工作了,下面用nginx反向代理127.0.0.1:9503,修改 /usr/local/nginx/conf/nginx.conf如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
        upstream swoole{
                server 127.0.0.1:9503;
                keepalive 4;
        }
    server {
        listen       80;
        server_name  www.swoole.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            proxy_pass http://swoole;
            proxy_set_header Connection "";
            proxy_http_version 1.1;
            root   html;
            index  index.html index.htm;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
  • reload nginx使配置生效
  1. /usr/local/nginx/sbin/nginx -s reload
  • vim /etc/hosts,添加 127.0.0.1 www.swoole.com
  • 验证结果,curl www.swoole.com 或者浏览器打开这个域名,是不是还是出现 Hello Swoole了。

四、swoole使用经验贴

废了这么大功夫,如果只出现了个Hello Swoole是太low了点,我不剧透你耐心往下看。

  • 在./aliyun-oss-php-sdk目录下有个sample.jpg文件, 简单上传文件示例代码如下,
<?php
require_once __DIR__ . '/Common.php';

use OSS\OssClient;
use OSS\Core\OssException;

$bucket = Common::getBucketName();
$ossClient = Common::getOssClient();
if (is_null($ossClient)) exit(1);
//*******************************简单使用***************************************************************
$options = array(
    OssClient::OSS_FILE_DOWNLOAD => "example_download.jpg",
);

$ossClient->uploadFile($bucket, "example.jpg", "example.jpg");
$ossClient->getObject($bucket, "example.jpg", $options);
  • 执行并查看结果:

ll_sample
这是最简单的oss上传下载文件用法。

  • 仿照上面的步骤在swoole server中调用oss php sdk,并作nginx代理后,最简单的oss上传下载代码变成了这样:
<?php
require_once __DIR__ . '/Common.php';

use OSS\OssClient;
use OSS\Core\OssException;

$bucket = Common::getBucketName();
$ossClient = Common::getOssClient();
if (is_null($ossClient)) exit(1);
//*******************************简单使用***************************************************************

$options = array(
    OssClient::OSS_FILE_DOWNLOAD => "example_download.jpg",
);

$serv = new swoole_http_server("127.0.0.1", 9503);

$serv->set(array(
        'worker_num' => 16,
        'daemonize' => true,
        'max_request' => 10000,
        'dispatch_mode' => 2,
        'debug_mode'=> 1,
        'log_file' => '/tmp/swoole_http_server.log',
));

$serv->on('Request', function($request, $response) use($ossClient, $bucket, $options){

        $ossClient->uploadFile($bucket, "example.jpg", "example.jpg");
        $ossClient->getObject($bucket, "example.jpg", $options);

        $response->end("Hello Swoole\n");
});

$serv->start();
  • php sample/Swoole.php
  • curl www.swoole.com
    是不是发现长时间没反应,nginx报个错误。查看nginx的accesslog,发现报504。打开我们在swoole中设置的swoole_http_server.log发现:

error_nginx
这里有两层问题:

  • 问题一:从报错发现是oss php sdk没有找到这个example.jpg文件,example.jpg明明是个本地文件为什么会找不到?
  • 问题二:即使有这个错误为什么会造成nginx报504?

如何去解这两个问题?
对于问题一应该是swoole的坑,实际测试发现,swoole下相对路径是从根目录"/"算的,而不是当前目录。所以把文件写成绝对路径就ok了。
对于问题二我的理解是swoole的使用者必须去包装它所调用接口抛出的错误,对本文来说当然就是oss php sdk抛出的错误,以让nginx正确识别。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
5月前
|
应用服务中间件 PHP nginx
当你的nginx服务器和php服务器不在一起的时候,这个nginx 的root目录问题
两个服务器的网站代码目录需要对齐,docker容器里面也是一样
|
7月前
|
弹性计算 安全 开发工具
灵码评测-阿里云提供的ECS python3 sdk做安全组管理
批量变更阿里云ECS安全组策略(批量变更)
|
8月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
176 3
|
8月前
|
自然语言处理 编译器 应用服务中间件
PHP在服务器上的运行过程
PHP在服务器上的运行过程
136 7
|
8月前
|
监控 PHP Apache
优化 PHP-FPM 参数配置:实现服务器性能提升
优化PHP-FPM的参数配置可以显著提高服务器的性能和稳定性。通过合理设置 `pm.max_children`、`pm.start_servers`、`pm.min_spare_servers`、`pm.max_spare_servers`和 `pm.max_requests`等参数,并结合监控和调优措施,可以有效应对高并发和负载波动,确保Web应用程序的高效运行。希望本文提供的优化建议和配置示例能够帮助您实现服务器性能的提升。
388 3
|
8月前
|
PHP 开发者
PHP作为一门流行的服务器端脚本语言,深入理解PHP的命名空间
【10月更文挑战第22天】PHP作为一门流行的服务器端脚本语言,自1995年诞生以来,已经发展了二十多年。在这二十多年的时间里,PHP经历了多次重大版本的更新,不断增加新特性和改进。其中,命名空间(Namespace)是PHP 5.3.0引入的一个重要特性,它为PHP的代码组织和重用提供了一种新的方式。本文将从三个部分深入理解PHP的命名空间:一是命名空间的基本概念和作用;二是PHP命名空间的使用方法;三是通过实例讲解命名空间的应用。
74 4
|
8月前
|
数据采集 网络安全 PHP
用PHP抓取HTTPS资源时的常见问题与解决方法
本文探讨了在PHP中抓取HTTPS资源时常见的问题及其解决方案,包括SSL证书验证、反爬机制应对、HTTPS代理设置及提高抓取效率。通过代码示例展示了如何使用代理IP和合理设置请求头等方法,以高效获取贝壳网的房价数据。
|
9月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
98 3
|
10月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
11月前
|
PHP
PHP遍历文件并同步上传到服务器
在进行网站迁移时,由于原网站的图片文件过多,采用打包下载再上传的方式耗时过长,且尝试使用FTP工具从旧服务器传输至新服务器时失败。为解决此问题,特使用PHP编写了一款工具,该工具能扫描指定目录下的所有`.webp`图像文件,并将其上传至新的服务器,极大地提高了迁移效率。
156 16

相关产品

  • 对象存储