!新手! 关于PHP常驻内存的问题

这个系统 发布于 2017/03/25 17:03
阅读 1K+
收藏 0

最近学习用PHP做API接口,对PHP了解不多,有几个PHP运行原理的疑问,希望有前辈能指点,谢谢

(先假设没有APC、eACCelerator等代码缓存技术)

1、一个PHP脚本(假设该页面接收处理POST数据)文件被HTTP访问(请求开始->执行->输出)后,脚本里面的变量就全被销毁了。是吗?

2、假设PHP单进程的环境,如果这个PHP脚本被同客户端连续请求执行或者不同客户端连续不断请求执行,脚本里面的变量是否会随着单次的访问结束而销毁,会不会影响到下个或者并发的执行请求,比如$_POST变量的数据错乱。

3、在APACHE / NGINX生命周期内,如果想要将PHP变量常驻内存(指的是进程/线程生命周期内,不是脚本生命周期)该用什么方法呢(写入缓存文件好像是种方法,但频繁读写好像不利于效率,想看看有没有方法能放内存,不用第三方,如redis),YII。TP这些流行框架是如何做的呢?

 

希望大家帮助新手,不吝赐教

加载中
0
geminiblue
geminiblue

shmop_open()

打开或创建一个内存块来共享

shmop_close()

关闭一个共享内存块

shmop_delete()

删除一个共享内存块

shmop_read()

从一个共享内存块读取数据

shmop_write()

将数据写到一个共享内存块

shmop_size()

得到一个共享内存块的大小

0
geminiblue
geminiblue

php是多进程,用线程的话,要依赖一些第三方库,比如pthread

在请求处理完毕时,变量会销毁,这个在php手册的生命周期中有写

0
这个系统

谢谢楼上两位,就是不知道shmop效率及稳定性如何,

0
霸气千秋
霸气千秋

引用来自“这个系统”的评论

谢谢楼上两位,就是不知道shmop效率及稳定性如何,

shmop 功能php对是linux系统的共享内存的封装,理论上讲效率是非常高的,建议参考:http://cn2.php.net/manual/zh/book.shmop.php

或者 《unix 环境编程》

霸气千秋
霸气千秋
回复 @这个系统 : 所以说让你看后边那本书,这个功能是基于linux,跟php生存周期没有关系
这个系统
谢谢,大概看了shmop,大概都看到,没看到说这个函数的生命周期伴随进程还是脚本的?
0
eechen
eechen

1.Apache MOD_PHP或者PHP-FPM下,请求结束即释放资源,但不包括显示开启的由Apache或PHP-FPM保持的持久连接(如到MySQL的持久连接),脚本中所有变量都会被销毁.
2.PHP就算运行在多线程模式下,如配合多线程的Apache event MPM或者Apache winnt MPM运行时,PHP都是必须跑在线程安全模式下,所以肯定不会出现数据读写错乱的情况.
3.不依赖第三方内存K/V服务或PECL扩展,PHP自身同样可以在内存读写数据,比如你可以在Linux内存文件系统/dev/shm上保存$_SESSION的会话文件,或者在/dev/shm上读写PHP内置的SQLite数据库,因为在内存上,写入速度是相当快的.

在我的笔记本Ubuntu(i5-3230M)上用PHP内置的单进程HTTP服务器,执行insert/select读写Linux内存文件系统上的SQLite,每秒处理请求数(RPS)都能达到2660,1万个这样的请求不到4秒就能处理完.

<?php
$file = '/dev/shm/app/data.db3'; //保存在Linux内存文件系统上的SQLite
$ddl = '
BEGIN;
CREATE TABLE IF NOT EXISTS queue (
	id           INTEGER PRIMARY KEY AUTOINCREMENT,
	user_id      INTEGER
);
COMMIT;
';
if(!file_exists($file)) {
	$db = new PDO('sqlite:'.$file);
	$db->exec($ddl);
} else {
	$db = new PDO('sqlite:'.$file);
}
$user_id = time();
$stmt = $db->prepare('INSERT INTO queue(user_id) VALUES(?)');
$stmt->execute(array($user_id));
echo 'rowCount:'.$stmt->rowCount()."\n";        //查询中受影响(改动)的行数,插入失败时为0
echo 'lastInsertId:'.$db->lastInsertId()."\n";  //插入的自增ID,插入失败时为0

 

yak
yak
回复 @eechen : 一直有脑残,除了你没发现,很多人都发现了 没什么大惊小怪的
eechen
eechen
回复 @yak : @oschina 又有人脑残了
yak
yak
只有脑残会在虚拟盘上存数据库,就此一个
0
悠悠知我心
通常情况下 1、是的 2、不会 3、变量无法常驻内存,除非用一些扩展之类的
这个系统
谢谢
0
肖滔
肖滔
swoole,workerman就是做这方面的
返回顶部
顶部