隐式类型转换有无法命中索引的风险,在高并发、大数据量的情况下,命不中索引带来的后果非常严重。将数据库拖死,继而整个系统崩溃,对于大规模系统损失惨重。

MySQL 的隐式类型转换原则:

- 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
- 两个参数都是字符串,会按照字符串来比较,不做类型转换
- 两个参数都是整数,按照整数来比较,不做类型转换
- 十六进制的值和非数字做比较时,会被当做二进制串,和数字做比较时会按下面的规则处理
- 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
- 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
- 所有其他情况下,两个参数都会被转换为浮点数再进行比较

注意一个安全问题:假如 password 类型为字符串,查询条件为 int 0 则会匹配上。

由于 MySQL 隐式类型转换规则比较复杂,依赖 MySQL 隐式转换很容易出现各种想想不到的问题,而且 MySQL 隐式类型转换本身也是非常耗费 MySQL 服务器性能的,所以非常不推荐这样使用。

1. 最常见的 APC

可以缓存 PHP 的 opcode 提高应用的性能
可以在同个 PHP-FPM 进程池的进程间共享数据
常用功能:
apc_store apc_fetch
apc_add apc_delete
apc_inc apc_dec
apc_cas
apc_clear_cache
apc_sma_info

2. Shmop Unix 系统共享内存使用接口

常用功能:
shmop_open shmop_close
shmop_read shmop_write
shmop_delete
ipcs -m  查看本机共享内存的状态和统计
ipcrm -m shmid 或 ipcrm -M shmkey 清除共享内存中的数据

3. SystemV Shm

常用功能:
ftok
shm_attach shm_detach
shm_put_var shm_get_var shm_remove_var

4. 使用共享内存需要考虑操作的原子性和锁、并行和互斥

sem 信号量相关函数:
sem_get sem_remove
sem_acquire sem_release (保证原子性)
其他常见锁机制:文件锁机制 flock

5. PHP 提供的 IPC 机制

–enable-shmop 共享内存,只能按字节操作
–enable-sysvsem 信号量
–enable-sysvshm 共享内存,和 shmop 的差别是提供的操作函数不同,支持 key、value操作
–enable-sysvmsg 消息队列
参考:

http://php.net/manual/zh/book.apc.php
http://docstore.mik.ua/orelly/webprog/pcook/ch05_07.htm
http://www.re-cycledair.com/php-dark-arts-shared-memory-segments-ipc