Code For Colorful Life
swoole框架中swoole_client的实现
swoole_client的实现源码主要在swoole-src/swoole_client.c中。
swoole_client有同步和异步两种使用方式,如下:
同步方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, 0.5))
{
die("connect failed.");
}
if (!$client->send("hello world"))
{
die("send failed.");
}
$data = $client->recv();
if (!$data)
{
die("recv failed.");
}
$client->close();
Read more...
PHP Generator的实现
对于Generator的实现,关键的数据结构是_zend_execute_data,已在这篇文章:PHP内核的一点探索——execute_data 介绍了。本文只是粗略的说明了Generator的实现~
Generator的创建
Generator的实现代码在Zend/zend_generators.c中,我们无法直接new一个Generator对象,如果直接new的话会报如下错误:
PHP Catchable fatal error: The "Generator" class is reserved for internal use and cannot be manually instantiated
在源码中可看到原因:
1
2
3
4
5
6
7
static zend_function *zend_generator_get_constructor(zval *object TSRMLS_DC) /* {{{ */
{
zend_error(E_RECOVERABLE_ERROR, "The \"Generator\" class is reserved for internal use and cannot be manually instantiated");
return NULL;
}
/* }}} */
Read more...
PHP execute_data
这阵子想研究下PHP Generator的实现,发现对于Generator很重要的一个数据结构为_zend_execute_data
,在PHP源码中通常是一个execute_data
变量,与该变量相关的宏是#define EX(element) execute_data.element
。
查看了下opcode的执行,发现_zend_execute_data
对于PHP代码的执行也是关键的数据结构。所以本文主要围绕该数据结构展开来讲~
Read more...
PHP 协程
理解生成器
参考官方文档:Generators 生成器让我们快速、简单地实现一个迭代器,而不需要创建一个实现了Iterator接口的类后,再实例化出一个对象。
一个生成器长什么样?如下
1
2
3
4
5
6
<?php
function foo() {
……
yield [$someValue];
……
}
与一般函数的区别在于:
- 它不能
return $notNULLValue
(不能有,会报语法错误= =PHP Fatal error: Generators cannot return values using "return"
),但可以是return;
(相当于return NULL;
其实当一个函数没有明确进行return时,PHP会自动为函数加入return;
) - 必须含有yield关键字(当生成器执行的时候,每次执行到yield都会中断,并且将
$someValue
作为返回值,如果有的话,没有则是返回NULL)。yield的具体语法见:Generator syntax - 它会被转换为Generator类的一个对象
Read more...
MySQL Gtid复制方案学习
MySQL从5.6开始出了新的主从复制解决方案:Replication with Global Transaction Identifiers。
GTID解决的问题:
- 在整个复制集群中能够唯一的标识一个事务
- 更方便的实效转移
- 确保同一个事务只会被执行一次
GTID的限制:
- 无法使用
CREATE TABLE ... SELECT statements
语句 - 无法在事务中对非事务存储引擎进行更新
- 无法在事务中使用
CREATE TEMPORARY TABLE
- 具体可参考:Restrictions on Replication with GTIDs
Read more...
如何保障用户密码安全
如何安全存储密码
1、使用哈希算法直接对密码进行hash
如md5(password)
,sha1(password)
等,这种做法在当前时代已经不安全了,因为随着“彩虹表”不断变大,如果被拖库了,用户的密码就容易被反哈希出来。国内密码学专家王小云已成功破解了md5和sha1.
Read more...
认识SQL注入的类型
SQL的注入类型有以下5种:
- Boolean-based blind SQL injection(布尔型注入)
- Error-based SQL injection(报错型注入)
- UNION query SQL injection(可联合查询注入)
- Stacked queries SQL injection(可多语句查询注入)
- Time-based blind SQL injection(基于时间延迟注入)
Read more...