Laravel定时任务写入日志用户变为root导致Web进程无法写入日志问题

今天访问接口时返回 接口写入日志失败,通过排查后发现 storage/logs下面出现了root用户新建的日志,导致www用户无法写入日志。

通过排查发现,crontab写入了laravel定时任务命令。默认情况下,crontab的任务是使用root用户去执行的,因此laravel定时任务新建的文件属主自然成为了root

解决方法

解决方法就是使用指定用户来运行 crontab 任务。比如使用www用户来运行laravel的计划任务命令。

PHP和JS加解密

最近遇到的几个网站在提交密码时提交的已经是密文,也就是说在网络上传输的密码是密文,这样提升了密码在网络传输中的安全性。

后端语言加解密已经有很成熟的方案了,前端的话Google之前出过一个crypto-js,为浏览器的js提供了加解密方案。今天一起来了解一下基于AES的前后端加解密流程。

Javascript

解决数据库N+1查询问题

需求

数据表如下:

department表

在Swoole环境下运行注入Yii2框架的thrift应用

前两天发布了使用swoole来运行thrift应用,项目虽然可以运行起来,但是周边的生态(如缓存,ORM,日志等等)并没有跟上,实际上开发体验比较差。周末研究了一下,把Yii2框架集成到了thrift应用上。

项目地址:https://github.com/swoole-foundation/yii2-swoole-thrift

Yii2优势:

在swoole上运行Yii2应用

Yii2:业界著名的开发框架,完美的OOP设计以及组件化开发思想保证了框架的扩展性。
Swoole:面向生产环境的 PHP 异步网络通信引擎。使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。

Yii2优点

  • 完美的OOP设计

使用swoole来运行thrift应用

Swoole扩展简介

Swoole:面向生产环境的 PHP 异步网络通信引擎

使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。

在缓存中使用闭包函数

闭包函数

PHP官方文档对于闭包函数的定义:

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

在事务中使用闭包函数简化开发

闭包函数

PHP官方文档对于闭包函数的定义:

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

c语言实现简单版的php z_val结构体

源码

学习过PHP的人都知道PHP是基于C语言开发的,但是C语言是强类型的,PHP如何实现弱类型呢?答案在于这个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
zend_ast *ast;
} zvalue_value;

struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};

type保存了实际的类型,而value这个共用体保存了具体的值,我们使用到变量的时候需要根据变量类型来取出_zvalue_value中保存的具体值。
采用union能够避免内存浪费,同一时刻,一个_zval_struct中的共用体zvalue_value只有一个成员会分配内存,避免了无谓的内存分配。

redis常用实践

Redis相信大家都不陌生,而如果只是用来取代memcached做缓存的话,实在是大材小用了。一起来看看生产环境下的常用用法。

分布式锁

1
2
3
4
$canLock = $redis->set('k', 1, 'NX', 'EX', 2);
if($canLock) {
// 获得锁成功
}

锁定键名为k的数据两秒钟,两秒后该方法才能重新获取锁

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×