分类目录归档:PHP

PHP7.4 发布 来说一下改进和新功能

空合并运算符 ??=

PHP新增一个 空合并运算符 ??= ,如下demo

<?php
$a??=1; // $a = isset($a)?$a:1;
echo $a; // 1

当前置变量 没有 赋值或为null 时,将后置变量赋值给前置变量,相当于 $a = $a??1;
$a = $a??1; 相当于 $a = isset($a)?$a:1; 注意 ?? 需要一个变量来接收,
而 ??= 是自动用前置变量来接收。
所以最终 $a??=1 相当于 $a = isset($a)?$a:1;

属性类型

意思呢就是 类的属性支持强类型了,这个功能我可是期待很久的。奈何 7.4 之前的版本并不支持。这样就能更严格的控制变量类型了。

对此说明一点,就目前来讲 强类型 并不会提高太多性能,只是让开发人员更清晰控制变量类型,都说 强类型 是编译性语言的特性,因为强类型有利于编译执行。当PHP有了强类型后,相信不久的将来 编译执行 特性也会来临,比如 p++。

箭头函数

这个箭头函数在JS等语言可能经常出现,其实就是 ()=>{} 常用于写匿名函数或操作数很精简的函数。

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);

这是一个官方的 demo ,如果不知道 array_map 函数的意思可以查一下手册。

<?php

$fn = fn($a, $b, $c = 1) => $a + $b + $c;
echo $fn(1, 1); // 3

这个例子可能更简单,其实就是一个更简单一些
fn 是 function 的简写,函数内可以接收多个参数包括可选参数,箭头函数体内不能包括在 大括号 {} 内,仅允许一个表达式,并自动 return 返回,如果要更复杂的操作还是 常规的匿名函数来的方便。

数组展开 Unpacking inside arrays

这个特性也非常舒适,当你需要将两个数组合并时往往是用过 []+[] 或 array_merge 去合并数组,但当你新建立一个数组需要包含已有数组时往往只能 先创建再和合并数组,此时我们可以使用 …[] 来嵌套并展开已有数组。

<?php

$a = [1,2,3,4,5]; //已有数组

$b = [7,8,9,…$a];

var_dump($b); // [7,8,9,1,2,3,4,5];

数值分隔符

这个简单了解一下就好,就是数值中间穿插下划线 _ 会自动忽略,不会对数值产生影响。不知道这个特性有什么好处,毕竟一般分割是逗号 1,000 但是逗号在编程中又有特殊意义。

更多的参考官方文档吧

https://www.php.net/manual/en/migration74.new-features.php#migration74.new-features.core.unpack-inside-array

Nginx通过socket连接php-fpm

当我们Nginx和PHP配置在同一台服务器时,推荐使用套接字 socket直接对接。开销小,适合大并发使用。

修改php-fpm配置文件 直接安装的可能在php-fpm.d/www.conf
#listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock

同时注意修改权限
如果你的nginx运行在www、nginx用户下则需要同步修改 否则将提示404 ,查看nginx日志可以大概是如下提示连接失败
# *43 connect() to unix:/dev/shm/php-cgi.sock failed (2: No such file or directory) 

user = www
group = www
listen.owner = www
listen.group = www

修改nginx配置文件server段的配置,将http的方式改为socket方式

location ~ .*\.(php|php5)?$  {
                #fastcgi_pass  127.0.0.1:9000;
                fastcgi_pass   unix:/dev/shm/php-cgi.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }

PHP SOCKET PHP开发聊天服务器

一千发布过一个基于NodeJs的聊天Socket版本,不过更多人作为PHP的开发者想用更熟悉的语言来做后端语言处理

因此有了续集就是这篇文章

更多的介绍就免了,更多信息请前往我的github查看,顺便送上你的小心心哦!

 

https://github.com/Yanlong-LI/PHP-WebSocket

PHP SOCKET

运行方式

php demo.php

默认监听127.0.0.1:3000

如需修改可直接修改配置文件

在浏览器中打开

index.html

想简单使用?

请看 simplify分支 来处理

请确保你已经php程序的bin加入path环境变量,否则请使用你的php绝对路径

越来越发现我写的很渣 或许哪天会重新写

2018年6月22日 项目开始重新编写,引入日志等框架。组成后期长期使用框架 2018年6月22日 修复NGINX代理WSS加密连接无法成功问题 修复单个socket在linux下同是阻塞问题

2018年6月20日

修改对websocket帧的mask处理新的方式更简单易懂可扩展

2018年6月6日 修复html代码未转义导致对其他用户造成可入侵问题

for_redis

请看 for_redis分支 来处理

:这是一个引入redis储存聊天记录的分支。主分支为了保持简洁性,并未加入过多特性。但web应用的特性,会进行刷新导致历史记录的丢失。本分支便是为了解决这一问题。纯粹的使用服务器的内存容易造成程序过载导致崩溃。

请确保你的服务器开启了redis服务并且安装了PHP-redis扩展

php基于redis的任务队列

#任务队列

这只是一个小型架构,不适用于复杂性及大型队列。

你可以用此来进行发短信,发邮件,定时处理一些不是特别耗时并且不会引起太大错误的项目

大型项目推荐swoole

 

GITHUB地址奉上:

https://github.com/Yanlong-LI/PHP-WebSocket

启动方式

请先更新composer包
    composer update
 后续启动进入 application 目录 
 执行 php index.php

说明

基于PHP+Redis开发的单线程任务队列.

如果您想提高效率及并发,仅需要多开即可.

本程序为测试项目,适合小型任务队列.并且因过于简陋,所以请确保你扩展的服务可以正常运行,否则致命错误将可能导致程序终止运行.
若需要配合Mysql等数据库或其他扩展请自行在服务中处理.不推荐写在主文件中.

本程序没有处理redis关闭问题,请确保启动redis后运行本程序并且保持redis运行,否则将出错.

程序没有额外引入日志系统,没有日志查询.请自行处理.或这几用 error_log

若为后台启动,可修改redis中 server为0即可在执行完服务后自动关闭

demo

demo中执行为 向队列增加刷新配置信息服务 

备注:

本项目原作用于公司内部小架构的临时队列服务.感觉还凑合就开放源代码.网络从来不缺少代码,只缺少思想.

请遵循MIT协议

demo中出现的案例可能涉及业务信息,请不要进行利用.

2018年8月7日 2018年8月3日 基于项目的mysql导入unitimport服务 增加demo所需要的sql

2018年8月2日 基本架构设想 基本结构创建 刷新配置服务demo

PHP7.0及以上版本安装ecshop时不支持mysql扩展的解决方案

当我们使用PHP7.0及以上版本安装EcShop时会卡在检测环境哪里,因为EcShop默认使用的是Mysql扩展而非MySQLI扩展,高版本废弃了mysql扩展。需要通过修正Ecshop的安装代码进行安装。包括检测代码及mysql连接查询语句进行mysqli的版本升级。

包括mysql_query(“select …”,$link)替换成mysqli_query($link,”select …”)

如上连接的前后顺序进行了更替。

关于mysql和mariadb的使用问题(非全)

很多朋友问我,说在网上下载了开源的项目去安装时系统报500错误,找不到原因。尝试去更换PHP版本依旧无果。最后我在远程协助时发现他们使用的数据库并非MySQL而是mariaDB,这便是问题的所在。因为mariaDB兼容MySQL的操作包括API,但还是有些特别的区别。导致在安装开源项目时执行SQL错误。所以请更多人在安装开源项目时仔细阅读推荐的运行环境和自己的运行环境。

关于即将准备的密码储存功能问题汇总

互联网发展迅速,各种产品也是五花八门,各种社区、论坛(貌似意思差不多)、还有全球最大的“同性交友”社区GITHUB(嗯哼)???常用的还好说,但是很多小网站比如某些技术论坛,也就当时查资料可能需要用到注册了账号,过了很久很久以后(三年后···)扯远了,反正就是越来越多,密码呢也为了某个APP被各种泄露防止被通杀,这就考验记忆力了,时间久了密码都串了,深受其害啊~~~~~

所以下一个上线的小产品就是密码管理器了。名字还没想好,到时候再说,因逻辑简单过程虽然复杂,所以不考虑使用PHP框架,当然后续开发完善后会涵盖Windows、Web、Android、IOS等平台。

下面是基本框架:

用户基础账户:签名加密如MD5、SHA1、SHA256、SHA512当然不会这么简单啦。多复杂也没意义,被黑了都是浮云。

账户管理:

账户、密码都将采用RSA加密传输到服务器(这里用到的RSA密钥对是公共的根据周期进行更新),服务器解密后会使用另一套RSA进行二次加密(每个用户都是单独的RSA密钥对、如无特殊情况不进行更替)。

下面就是大致的流程图,目前还在你考虑细节,可能会有改动。如在如何安全储存用户信息方面。