Coder Social home page Coder Social logo

mix-php / mix Goto Github PK

View Code? Open in Web Editor NEW
1.9K 74.0 211.0 8.26 MB

☄️ PHP CLI mode development framework, supports Swoole, WorkerMan, FPM, CLI-Server / PHP 命令行模式开发框架,支持 Swoole、Swow、WorkerMan、FPM、CLI-Server

Home Page: https://openmix.org/mix-php

License: Apache License 2.0

Shell 0.47% PHP 96.69% Go 2.59% PLpgSQL 0.25% JavaScript 0.01%
swoole coroutine framework http websokcet mix grpc mixphp workerman cli

mix's Introduction

OpenMix 出品:https://openmix.org



MixPHP

Mix PHP

中文 | English

MixPHP 是一个 PHP 命令行模式开发框架;基于 Vega 驱动的 HTTP 可以同时支持 Swoole、Swow、WorkerMan、FPM、CLI-Server 生态,并且可以无缝切换;V3 是一个高度解耦的版本,整体代码基于多个独立的模块构建,即便用户不使用我们的脚手架,也可以使用这些独立模块,并且全部模块都支持原生开发。例如:你可以只使用 mix/vega 来搭配 laravel orm 使用;可以在任意环境中使用 mix/database 和 mix/redis;可以使用 mix/grpc 原生代码编写 gRPC;所有的模块你可以像搭积木一样随意组合。

独立模块

核心模块全部可独立使用,并且都支持原生代码开发。

  • mix/vega PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、Swow、WorkerMan、FPM、CLI-Server
  • mix/database 可在各种环境中使用的轻量数据库,支持 FPM、CLI、Swoole、WorkerMan,可选的连接池 (协程)
  • mix/redis 可在各种环境中使用的 PHP Redis,支持 FPM、CLI、Swoole、WorkerMan,可选的连接池 (协程)
  • mix/redis-subscriber 基于 Swoole 协程的 Redis 原生协议订阅库
  • mix/grpc 基于 Swoole 协程的 PHP gRPC 库,包含 protoc 代码生成器、服务器、客户端
  • mix/websocket 基于 Swoole 协程的 PHP WebSocket 服务器与客户端
  • mix/cli PHP 命令行交互指挥官
  • mix/worker-pool 基于 Swoole 的协程池、工作池库
  • mix/validator 基于 PSR-7 的验证库
  • mix/event 基于 PSR-14 标准的事件调度库
  • mix/init 帮助执行类的静态初始化,通常用于预加载单例

服务器

支持多种服务器驱动,并且可以无缝切换。

开发文档

快速开始

提供了现成的脚手架,快速创建项目,立即产出。

composer create-project --prefer-dist mix/cli-skeleton cli
composer create-project --prefer-dist mix/api-skeleton api
composer create-project --prefer-dist mix/web-skeleton web
composer create-project --prefer-dist mix/websocket-skeleton websocket
composer create-project --prefer-dist mix/grpc-skeleton grpc

性能测试

techempower-benchmark.png

web-frameworks-benchmark.png

推荐阅读

AD 混联网关

混联网关 - 可编程分布式长连接网关

  • 可用于聊天室、直播弹幕、IM即时通讯、在线客服、网络游戏、硬件通讯、智能家居、物联网等领域的开发
  • 几行代码,免费搞定socket、websocket实时通讯

技术交流

知乎:https://www.zhihu.com/people/onanying
官方QQ群:284806582, 825122875 敲门暗号:phper

Golang 框架

OpenMix 同时还有 Golang 生态的框架

License

Apache License Version 2.0, http://www.apache.org/licenses/

mix's People

Contributors

bbuugg avatar cexll avatar dependabot[bot] avatar huangdijia avatar nhzex avatar onanying avatar pandaliu-1111 avatar quhaowk avatar sjfxy avatar sy-records avatar syanh avatar thinker-gao avatar writethesky avatar yianandcode avatar yupeng2015 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mix's Issues

文件上传的问题

做文件上传,后端dump出来的数据一直显示临时文件为“tmp/swoole.upload.xxxxx“,并且size=0,修改mixphp/mix1/web/Request.php 里面代码,将内部onInitialize方法里的执行父类onInitialize注释掉就正常了

当使用左进程进行调用$worker->send($messages);出现错误

当数组大小为1时,不会出打印出错误
如果数组大小为2是或者更多,会出现错误
备注:数组内部为对象:
打印错误为:
[2019-02-11 23:48:39 @19603.0] ERROR swMsgQueue_push(:104): msgsnd(65536, 2468, 1) failed. Error: Invalid argument[22].

打印位置BaseQueue.php push方法
当数组长度为1时,序列化的内容为

a:1:{i:0;O:16:"MQ\Model\Message":9:{s:16:"*receiptHandle";s:93:"2F630CC85E5C3D4EAC69389B9775013B-OSAxNTQ5OTAwMTIwOTU5IDMwMDAwMCA3IDAgaHotc2hhcmUyLTAzIDEgOQ==";s:14:"*publishTime";s:13:"1549900120949";s:18:"*nextConsumeTime";s:13
:"1549900420959";s:19:"*firstConsumeTime";s:13:"1549900120959";s:16:"*consumedTimes";s:1:"1";s:9:"messageId";s:32:"2F630CC85E5C3D4EAC69389B9775013B";s:14:"messageBodyMD5";s:32:"8D7B3DF974943E802F6C4D70D2293D3B";s:11:"messageBody";s:738:"{"db"
:{"uid":"100033","app_id":"100270","url":"http:\/\/www.kancloud.cn\/manual\/thinkphp5_1\/354102","title":"\u4eca\u5929\u8fd8\u6ca1\u6709\u7b7e\u5230\u54e6\uff0c\u4e0d\u8981\u5fd8\u8bb0\u4e86\u554a","description":"\u6cd5\u5e08\u6253\u53d1\u65a
f\u8482\u82ac","tid":"100028","push_description":"\u8fd9\u91cc\u63a8\u9001\u63cf\u8ff0"},"push":{"uid":"100033","app_id":"100270","url":"http:\/\/www.kancloud.cn\/manual\/thinkphp5_1\/354102","title":"\u5de5\u4f5c\u901a\u77e5:\u6cb3\u5357\u77
01\u7b2c\u4e00\u4eba\u6c11\u533b\u9662","description":"[\u7b7e\u5230]\u4eca\u5929\u8fd8\u6ca1\u6709\u7b7e\u5230\u54e6\uff0c\u4e0d\u8981\u5fd8\u8bb0\u4e86\u554a","tid":"100028","push_description":"\u8fd9\u91cc\u63a8\u9001\u63cf\u8ff0"},"versio
n":"1"}";s:10:"messageTag";N;}}

当数组长度为2时,序列化的内容为

string(2468) "a:2:{i:0;O:16:"MQ\Model\Message":9:{s:16:"*receiptHandle";s:93:"2F630B0D5D5C3D4EAC69389B8EFC009F-MTAgMTU0OTkwMDEyMDA4NyAzMDAwMDAgMyAwIGh6LXNoYXJlMi0wNCAzIDEw";s:14:"*publishTime";s:13:"1549900118780";s:18:"*nextConsumeTime";s:13
:"1549900420087";s:19:"*firstConsumeTime";s:13:"1549900120087";s:16:"*consumedTimes";s:1:"1";s:9:"messageId";s:32:"2F630B0D5D5C3D4EAC69389B8EFC009F";s:14:"messageBodyMD5";s:32:"8D7B3DF974943E802F6C4D70D2293D3B";s:11:"messageBody";s:738:"{"db"
:{"uid":"100033","app_id":"100270","url":"http:\/\/www.kancloud.cn\/manual\/thinkphp5_1\/354102","title":"\u4eca\u5929\u8fd8\u6ca1\u6709\u7b7e\u5230\u54e6\uff0c\u4e0d\u8981\u5fd8\u8bb0\u4e86\u554a","description":"\u6cd5\u5e08\u6253\u53d1\u65a
f\u8482\u82ac","tid":"100028","push_description":"\u8fd9\u91cc\u63a8\u9001\u63cf\u8ff0"},"push":{"uid":"100033","app_id":"100270","url":"http:\/\/www.kancloud.cn\/manual\/thinkphp5_1\/354102","title":"\u5de5\u4f5c\u901a\u77e5:\u6cb3\u5357\u77
01\u7b2c\u4e00\u4eba\u6c11\u533b\u9662","description":"[\u7b7e\u5230]\u4eca\u5929\u8fd8\u6ca1\u6709\u7b7e\u5230\u54e6\uff0c\u4e0d\u8981\u5fd8\u8bb0\u4e86\u554a","tid":"100028","push_description":"\u8fd9\u91cc\u63a8\u9001\u63cf\u8ff0"},"versio
n":"1"}";s:10:"messageTag";N;}i:1;O:16:"MQ\Model\Message":9:{s:16:"*receiptHandle";s:93:"792BCECC6D5A3D4EAC69389B92570138-MTAgMTU0OTkwMDEyMDA4NyAzMDAwMDAgMyAwIGh6LXNoYXJlMi0wNCAwIDEw";s:14:"*publishTime";s:13:"1549900119639";s:18:"*nextConsum
eTime";s:13:"1549900420087";s:19:"*firstConsumeTime";s:13:"1549900120087";s:16:"*consumedTimes";s:1:"1";s:9:"messageId";s:32:"792BCECC6D5A3D4EAC69389B92570138";s:14:"messageBodyMD5";s:32:"8D7B3DF974943E802F6C4D70D2293D3B";s:11:"messageBody";s
:738:"{"db":{"uid":"100033","app_id":"100270","url":"http:\/\/www.kancloud.cn\/manual\/thinkphp5_1\/354102","title":"\u4eca\u5929\u8fd8\u6ca1\u6709\u7b7e\u5230\u54e6\uff0c\u4e0d\u8981\u5fd8\u8bb0\u4e86\u554a","description":"\u6cd5\u5e08\u6253
\u53d1\u65af\u8482\u82ac","tid":"100028","push_description":"\u8fd9\u91cc\u63a8\u9001\u63cf\u8ff0"},"push":{"uid":"100033","app_id":"100270","url":"http:\/\/www.kancloud.cn\/manual\/thinkphp5_1\/354102","title":"\u5de5\u4f5c\u901a\u77e5:\u6cb
3\u5357\u7701\u7b2c\u4e00\u4eba\u6c11\u533b\u9662","description":"[\u7b7e\u5230]\u4eca\u5929\u8fd8\u6ca1\u6709\u7b7e\u5230\u54e6\uff0c\u4e0d\u8981\u5fd8\u8bb0\u4e86\u554a","tid":"100028","push_description":"\u8fd9\u91cc\u63a8\u9001\u63cf\u8ff
0"},"version":"1"}";s:10:"messageTag";N;}}"

websocket demo 有问题。redis sub 没法取消已经关闭的连接

如题: 如果用redis,sub/pub. 客户端主动断开。 但是redis的sub 还存在该连接客户端, 到时候pub 时候, 错误日志会
NOTICE swFactoryProcess_finish (ERROR 1005): connection[fd=2] does not exists。 or
NOTICE swFactoryProcess_finish (ERROR 1004): send 70 byte failed, because connection[fd=31] is closed.

然后再redis-cli publish 返回的数量,也是发现这些关闭的还在订阅 频道

Did not register this component: db

项目刚安装好运行起来,想试试数据库操作,提示我没有注册db组件
Did not register this component: db [0] Mix\Exception\ComponentException in /data/project/mix/vendor/mix/framework/src/Core/Container/Container.php line 43

全局变量

怎么定义全局变量,在那个文件可以定义,是否只能在入口文件(bin/mix-httpd)?

readme typo

expected:

开发方式几乎与传统 MVC 框架完全一致,用户无需了解 Swoole 即可开始开发。

got instead:

开发方式几乎与传统 MVC 框架完全一至,用户无需了解 Swoole 即可开始开发。

Cannot access 'domain/api/user' when routes conf has already been set

  • environment : homestead 5.0.1
  • nginx conf
    as document told
  • dictionary
/
┕---web
   ┕---index
        ┕---controller
            ┕---api
                ┕---UserController extend Controller  <-- Mix\web\Controller
                     ┕---public function actionIndex()
  • main_web
'rules'   => [
       'api/:controller/:action' => 'api/:controller/:action',
],
  • way to start mixPHP
sudo mix-httpd service/start -d -u
  • question
    I cannot visit domain/api/user however domain/api/user/index can be visited

gpl协议,不利于推广

框架不错,希望能一直保持轻量高效的特点,只是gpl协议有点不利于推广。基于框架无法搞商业应用,这个就把很多潜在用户拒之门外了。能否考虑采用更加开放的开源协议?

composer 版本管理

该建议不代表强烈建议,只是感觉需要权衡考量。

mixphp/mix1 framework 做为 composer 的一个包有以下几个好处:

  1. 便于版本化,通过 composer.lock 文件可以固定当前项目使用的 mix 版本,减少因为版本导致的问题
  2. 感觉像当前如果比如我要更新 mix 框架,只能下载新的 release 包,然后替换其中的 mixphp\mix1 目录
    缺点也是有的:
  3. 增加了用户使用的门槛,因为确实当前国内对 composer 的了解和使用还是有所欠缺的(但我想用户都已经能了解 swoole 了,应该不难去学习下 composer 的基本用法吧,何况这是趋势所向呢)
  4. 其他我没想到的一些困难麻烦吧

协程websocketk客户端咨询

协程方式开启websocket客户端。
请问,框架可以实现吗

比如我想后端连接第三方提供的websocket,动态建立多个socket隧道,并保持监听状态。
动态增加隧道数量这样的需求,框架里面有实现swoole里面的Coroutine\Socket吗?

image

长连接问题

RedisPersistent,PdoPersistent这两个貌似都没有真的用到长连接,redis及mysql的连接走的php扩展的方式连接的,redis长连接的明显特征是$redis->pconnect($this->host, $this->port),mysql长连接的特征是array(PDO::ATTR_PERSISTENT => true).
然后,虽然connect对象存储起来了,但把对象存储起来就是长连接吗?

自定义函数

问一下一般自己定义的函数放哪里他可以自动加载丫

控制器继承问题

官方文档《session》一节

效验Session:

需创建一个 BaseController 控制器,然后其他控制器继承该控制器。

// BaseController 的初始化事件
public function onInitialize()
{
    parent::onInitialize(); // TODO: Change the autogenerated stub
    $userinfo = \Mix::app()->session->get('userinfo');
    if (empty($userinfo)) {
        \Mix::app()->response->redirect('/');
        \Mix::app()->response->send();
        \Mix::app()->end();
    }
}

BaseController只能放在子类的同级目录么?
我在apps\index\下新建目录base\,BaseControoler放在该目录下是否可行? 我试了下,发现子类无法继承到该父类,是我方式不对么?还是有更好的解决方案

可否支持无限路由

手册里路由只能手动定义
能不能自由定义无限路由?
不需要像手册那样

如果我有多层级,比如 http://site.com/api/member/info/account/index
类似这样的,层级很多,如果按照手册的,需要一个一个去定义,那非常的不方便。

// 路由规则
'rules'          => [
    // 只有GET或POST才可访问
	'GET|POST api/:controller/:action' => ['api/:controller', ':action'],
],

mysql连接超时,报管道错误问题

当my.cnf配置中俩个参数wait_timeout,interactive_timeout设置很小的时候,且使用mix长连接组件PdoPersistent、其中的参数"persistentTime" 设置小于wait_timeout,interactive_timeout,会报以下的错误
mix\client\BasePdo::disconnect(): send of 5 bytes failed with errno=32 Broken pipe

websocket问题

按照官方文档中的客户端代码测试websocket服务,发现以下问题:
刷新客户端页面后,再次发送join room那条命令,后台会报错。

我看了下chrome的console日志,发现刷新页面时,并没有调用onclose关闭连接,不知道服务端是不是也没有关闭连接,导致join room时的广播出问题了,之前的连接还存在,并被认为是一个无效的socket连接。

建议使用 .gitignore 代替使用 index.html

我看在目录结构上,您是使用的 index.html 来保证目录存在的,当然用 index.html 也能保证目录不被用户访问到。但是我觉得使用 .gitignore 或许会更好,几点原因:

  1. . 文件不论是在 linux 还是在 windows,都能很好的隐藏,因为这不是用户关注的文件
  2. 比如像 libray 这类需要用户保留目录的,可以使用 .gitkeep
  3. 比如像 runtime 这类不需要保存到 git 版本库的,一定是使用 .gitignore 的,及时这里你不加,最终用户也是要加这个的
  4. 框架本身就已经限定了用户能访问的目录在 web\public 下,所以用户是没有可能直接访问到 libray 这类目录的

HttpServer里onRequest全局变量问题

这里直接把$request, $response放在全局变量\Mix::app(),多个用户并发请求,变量不是污染(被后续变量覆盖了)了吗?不应该每个请求来创建一个\Mix对象吗?

Uncaught mix\exceptions\ErrorException: Undefined index: host in /data/mix/vendor/mixstart/framework/swoole/HttpServer.php:95

mixphp运行了一段时间(约有两个星期),在error.log中看到报下面的错误,一天内有几十条左右。检查了一下配置未发现问题。
详细错误日志信息如下:
[time] 2018-05-15 00:27:12
[code] 1
[message] Uncaught mix\exceptions\ErrorException: Undefined index: host in /export/webapps/zepra-api/vendor/mixstart/framework/swoole/HttpServer.php:95
Stack trace:
#0 /export/webapps/zepra-api/vendor/mixstart/framework/swoole/HttpServer.php(95): mix\web\Error::appError(8, 'Undefined index...', '/export/webapps...', 95, Array)
#1 {main}
thrown
[type] mix\exceptions\ErrorException
[file] /export/webapps/zepra-api/vendor/mixstart/framework/swoole/HttpServer.php line 95
[trace] #0 [internal function]: mix\web\Error::appShutdown()
#1 {main}
$SERVER
(
[MANPATH] => +HOME/man
[LESS_TERMCAP_mb] => �[01;31m
[HOSTNAME] => ip-10-240-10-133
[LESS_TERMCAP_md] => �[01;38;5;208m
[LESS_TERMCAP_me] => �[0m
[SHELL] => /bin/bash
[TERM] => xterm
[HISTSIZE] => 1000
[SSH_CLIENT] => 52.220.115.23 45478 22
[EC2_AMITOOL_HOME] => /opt/aws/amitools/ec2
[GOBIN] => /home/synative/gopath/bin
[PYTHON_INSTALL_LAYOUT] => amzn
[LESS_TERMCAP_ue] => �[0m
[SSH_TTY] => /dev/pts/1
[USER] => synative
[LS_COLORS] => rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arc=01;31:.arj=01;31:.taz=01;31:.lha=01;31:.lz4=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz=01;31:.tzo=01;31:.t7z=01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31:.gz=01;31:.lrz=01;31:.lz=01;31:.lzo=01;31:.xz=01;31:.bz2=01;31:.bz=01;31:.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01;31:.jar=01;31:.war=01;31:.ear=01;31:.sar=01;31:.rar=01;31:.alz=01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31:.rz=01;31:.cab=01;31:.jpg=01;35:.jpeg=01;35:.gif=01;35:.bmp=01;35:.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35:.xpm=01;35:.tif=01;35:.tiff=01;35:.png=01;35:.svg=01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:.mpg=01;35:.mpeg=01;35:.m2v=01;35:.mkv=01;35:.webm=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35:.nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl=01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.axv=01;35:.anx=01;35:.ogv=01;35:.ogx=01;35:.aac=01;36:.au=01;36:.flac=01;36:.mid=01;36:.midi=01;36:.mka=01;36:.mp3=01;36:.mpc=01;36:.ogg=01;36:.ra=01;36:.wav=01;36:.axa=01;36:.oga=01;36:.spx=01;36:*.xspf=01;36:
[EC2_HOME] => /opt/aws/apitools/ec2
[LESS_TERMCAP_us] => �[04;38;5;111m
[PATH] => /export/jdk/bin:/export/jdk/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/usr/local/go/bin:/usr/local/go/pkg/tool/linux_amd64:/Golang/bin:/home/synative/.local/bin:/home/synative/bin:/usr/local/go/bin
[MAIL] => /var/spool/mail/synative
[PWD] => /export/webapps/zepra-api
[JAVA_HOME] => /export/jdk
[GOARCH] => amd64
[AWS_CLOUDWATCH_HOME] => /opt/aws/apitools/mon
[LANG] => en_US.UTF-8
[HISTCONTROL] => ignoredups
[HOME] => /home/synative
[SHLVL] => 2
[GOROOT] => /usr/local/go
[AWS_PATH] => /opt/aws
[GOOS] => linux
[AWS_AUTO_SCALING_HOME] => /opt/aws/apitools/as
[LOGNAME] => synative
[CVS_RSH] => ssh
[GOPKG] => /usr/local/go/pkg/tool/linux_amd64
[SSH_CONNECTION] => 52.220.115.23 45478 10.240.10.133 22
[CLASSPATH] => .:/export/jdk/lib/dt.jar:/export/jdk/lib/tools.jar:/export/jdk/jre/lib/rt.jar
[AWS_ELB_HOME] => /opt/aws/apitools/elb
[LESSOPEN] => ||/usr/bin/lesspipe.sh %s
[GOPATH] => /home/synative/gopath
[LESS_TERMCAP_se] => �[0m
[
] => bin/mix-httpd
[PHP_SELF] => bin/mix-httpd
[SCRIPT_NAME] => bin/mix-httpd
[SCRIPT_FILENAME] => bin/mix-httpd
[PATH_TRANSLATED] => bin/mix-httpd
[DOCUMENT_ROOT] =>
[REQUEST_TIME_FLOAT] => 1525922247.7231
[REQUEST_TIME] => 1525922247
[argv] => Array
(
[0] => bin/mix-httpd
[1] => service/restart
[2] => -d
)

[argc] => 3

)
$_GET
(
)
$_POST
(
)

Session问题

controller目录机构如下
apps/index/controllers
----admin
--------TestController.php
----IndexController.php
访问 /index/index,session正常,能写入cookie
访问 /admin/test/index,session无效,不能写入cookie,或者写入的cookie路径不是“/”,而是/admin/test

关注关注,顺便给个建议

class下的属性和方法建议注释采用规范的phpDoc形式,至少囊括 @var @param @return 这些吧,便于编辑器(像phpstorm)等提供代码提示的功能。
如果有需要,本人愿意提供开发帮忙,本人对 Yii2 框架非常熟悉,对 swoole 也有所使用,所以很看好该项目。

视图渲染问题

当在controllers目录下建立了子目录时,视图文件按规则建立,渲染会出问题。
例如:apps\index\controllers下新建目录admin,admin目录下新建控制器LoginController.php,控制器只有actionIndex方法
apps\index\views下新建目录admin\login,login目录下新建视图文件index.php
这种情况下无法找到视图文件,视图文件路径为 admin/_login/index.php,查看源码后发现是Mix\Base\Route中的camelToSnake()方法不够严谨导致的,原代码如下

// 驼峰命名转换为蛇形命名
    public static function camelToSnake($name, $separator = '_')
    {
        $name = preg_replace_callback('/([A-Z]{1})/', function ($matches) use ($separator) {
            return $separator . strtolower($matches[0]);
        }, $name);
        if (substr($name, 0, 1) == $separator) {
            return substr($name, 1);
        }
        return $name;
    }

该代码只去除了头部的分隔符。有子目录的情况下,_admin._login的后一个_也是应该要去除的,我试着修改了下代码,如下

// 驼峰命名转换为蛇形命名
    public static function camelToSnake($name, $separator = '_')
    {
        $name = preg_replace_callback('/([A-Z]{1})/', function ($matches) use ($separator) {
            return $separator . strtolower($matches[0]);
        }, $name);
        //add by Loay. Fix view render issue.
        $name = str_replace('.'.$separator, '.', $name);
        if (substr($name, 0, 1) == $separator) {
            return substr($name, 1);
        }
        return $name;
    }

Use user sessions with multiple servers?

Hi everyone,
a question can mix-php handle user sessions through multiple servers (front end ) connected to one database server ?

I am thinking of that laravel can handle it since one can store sessions in the database, is this possible to do the same with mix-php ?

Regards

重启服务报错,提示找不到Swoole\Process文件

PHP Fatal error: Uncaught Error: Class 'Swoole\Process' not found in /www/wwwroot/xxx.com/mixphp/vendor/mixstart/mixphp-framework/src/helpers/ProcessHelper.php:40
Stack trace:
#0 /www/wwwroot/xxx.com/mixphp/vendor/mixstart/mixphp-framework/src/helpers/ProcessHelper.php(31): mix\helpers\ProcessHelper::kill('17120', 0)
#1 /www/wwwroot/xxx.com/mixphp/vendor/mixstart/mixphp-framework/src/helpers/ProcessHelper.php(64): mix\helpers\ProcessHelper::isRunning('17120')
#2 /www/wwwroot/xxx.com/mixphp/apps/httpd/commands/ServiceCommand.php(66): mix\helpers\ProcessHelper::readPidFile('/var/run/mix-ht...')
#3 /www/wwwroot/xxx.com/mixphp/apps/httpd/commands/ServiceCommand.php(83): apps\httpd\commands\ServiceCommand->actionStop()
#4 /www/wwwroot/xxx.com/mixphp/vendor/mixstart/mixphp-framework/src/console/Application.php(82): apps\httpd\commands\ServiceCommand->actionRestart()
#5 /www/wwwroot/xxx.com/mixphp/vendor/mixstart/mixphp-framework/src/console/Application.php in /www/wwwroot/xxx.com/mixphp/vendor/mixstart/mixphp-framework/src/helpers/ProcessHelper.php on line 40

mix-httpd下的http_user_agent问题

我在mix-httpd下打印出来的的\Mix::app->request->server()里没有http_user_agent,这个信息是丢失了吗,还是要用其它方式去取

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.