PHP处理双通道内存必须一样吗问题,怎么解决

有实力,无所惧!努力!
PHP处理大量数据不超出内存限制的问题
例如从两张表中分别查出上百万条数据,现在需要把这些数据组装在一起然后在插入到另外一张表中,请问除了使用数组组装外还能怎么处理,如果使用数组的话怎么才能保证不超出内存限制。
mysql_query函数查询的方式是查询出全部结果后缓存到内存中,这样就会出现超内存的现象,使用另外一个函数mysql_unbuffered_query可以解决这个问题,mysql_unbuffered_query不会缓存结果集,而是查询出来数据后立马对结果集进行操作,也就是便查询边返回,这样就不会出现超出内存的现象,但是使用mysql_unbuffered_query的是时候不能使用 mysql_num_rows() 和 mysql_data_seek()。并且向
MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。例如:
使用缓存结果集的代码:
function selecttest(){
$pdo = new PDO("mysql:host=dbname=test", 'root', '123456');//不使用缓存结果集方式//$pdo-&setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo-&prepare('select * from test');
$sth-&execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
while ($result = $sth-&fetch(PDO::FETCH_ASSOC)) {
if ($i & 10) {
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
} catch (Exception $e) {
echo $e-&getMessage();
执行时将会报超出内存的错误:
Fatal error: Allowed memory size of
bytes exhausted (tried to allocate
bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 56Call Stack:
1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0
2. test-&selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:85
3. PDOStatement-&execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:56
将上面代码中的$pdo-&setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);一行的注释去掉后将不在缓存结果集,这时运行该函数的结果如下:
最初占用内存大小:144808Array(
占用内存大小:145544Array(
占用内存大小:145544Array(
占用内存大小:145536Array(
占用内存大小:145536
可以看到,这时返回一条数据内存占用非常的小,也就700多字节,这样就不会出现超出内存的错误了。
php进程内存限制---如何修改PHP的memory_limit限制
如何修改php内存限制
PHP 限制内存使用与查看
php.ini memory_limit引起的问题
PHP单个脚本超过内存限制上限时候的错误提示信息
PHP内存溢出解决方案
php 数据过大 内存溢出
PHP设置内存大小
修改PHP的memory_limit限制的方法
设置内存无限制
没有更多推荐了,&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
解决php进程过多并耗用系统大量内存的问题_PHP教程
摘要:中午在一台kvm上配置监控,但是明显感觉机器卡的受不了,就简单的排查了下1、查看服务器网卡流量sar-nDEV210可以看出网卡的流量并不是很大,排除网卡方面的问题。2、查看CPUtop上图可以看出CPU占用也不是很多,但是发现了很多php-cgi的进程&1/3&&&1&2&3&下一页&尾页
中午在一台kvm上配置监控,但是明显感觉机器卡的受不了,就简单的排查了下
1、查看服务器网卡流量
sar -n DEV 2 10
可以看出网卡的流量并不是很大,排除网卡方面的问题。
2、查看CPU
上图可以看出CPU占用也不是很多,但是发现了很多php-cgi的进程
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
解决php进程过多并耗用系统大量内存的问题_PHP教程相关信息,包括
的信息,所有解决php进程过多并耗用系统大量内存的问题_PHP教程相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
InternationalPHP大量数据循环导致内存耗尽如何解决?
作者:用户
本文讲的是PHP大量数据循环导致内存耗尽如何解决?,
如果我们在执行PHP程序出现下面代码时:PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 显然,我们的最大内存已经耗尽。因为我正在开发的这个程序
如果我们在执行程序出现下面代码时:PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 显然,我们的最大内存已经耗尽。因为我正在的这个程序是用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据。可想而知,4万条数据全部加载到内存中,内存不爆才怪。我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在官方网站上找到的正确的用法。这个问题在PHP的官方网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。相对的,另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。很显然,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。非缓冲查询方法一: i
= new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $mysqli-&query("SELECT Name FROM City", MYSQLI_USE_RESULT);
if ($uresult) {
while ($row = $uresult-&fetch_assoc()) {
echo $row['Name'] . PHP_EOL;
$uresult-&close();
非缓冲查询方法二: pdo_mysql
$pdo = new PDO("mysql:host=dbname=world", 'my_user', 'my_pass');
$pdo-&setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$uresult = $pdo-&query("SELECT Name FROM City");
if ($uresult) {
while ($row = $uresult-&fetch(PDO::FETCH_ASSOC)) {
echo $row['Name'] . PHP_EOL;
非缓冲查询方法三: mysql
$conn = mysql_connect("localhost", "my_user", "my_pass");
= mysql_select_db("world");
$uresult = mysql_unbuffered_query("SELECT Name FROM City");
if ($uresult) {
while ($row = mysql_fetch_assoc($uresult)) {
echo $row['Name'] . PHP_EOL;
本人用的是mysqli面向对象的方式。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
linux inode 耗尽解决、天刀内存耗尽怎么解决、结果集已耗尽怎么解决、解决天刀内存耗尽、天谕显存耗尽怎么解决,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!中午在一台kvm上配置监控,但是明显感觉机器卡的受不了,就简单的排查了下
1、查看服务器网卡流量
sar -n DEV 2 10
可以看出网卡的流量并不是很大,排除网卡方面的问题。
2、查看CPU
上图可以看出CPU占用也不是很多,但是发现了很多php-cgi的进程
3、查看系统内存
不看不知道,一看吓一跳,系统内存已经使用完了,并且也使用了swap剩余内存,但是究竟是什么程序占用了内存呢。
ps -ef | grep php
查看当前系统中的所有进程,过滤出来php相关的进程
大概统计了下,将近有200多个php相关进程,有什么方法能减少这些进程呢?
答案肯定是有的,在php-cgi的配置文件中是可以自定义php的进程数的。
vim /usr/local/php/etc/php-fpm.conf
max_children 字段,将后面的数字改成自己要定义的进程数
默认有256个,怪不了那么卡,我改成了100 个。
如果安装的是更高版本的PHP,则需要根据你的硬件配置设置合理的参数就可以了。
pm.max_children = 200
pm.start_servers = 100
pm.min_spare_servers = 50
pm.max_spare_servers = 150
pm.max_requests = 5000
结束所有的php进程
/usr/local/php-5.2.17/sbin/php-fpm start
在查看进程
发现明显减少了。
最后在查看下系统的内存
问题解决,系统也明显感觉不到卡了。
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至: 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。如何解决PHP里大量数据循环时内存耗尽的问题 – WEB骇客
如何解决PHP里大量数据循环时内存耗尽的问题
最近在开发一个PHP程序时遇到了下面的错误:
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
错误信息显示允许的最大内存已经耗尽。遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据。可想而知,4万条数据全部加载到内存中,内存不爆才怪。
毕竟编程这么多年,我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在官方网站上找到的正确的用法。
这个问题在PHP的官方网站上叫。PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。
相对的,另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。
很显然,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。
对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。
非缓冲查询方法一: mysqli
= new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $mysqli-&query("SELECT Name FROM City", MYSQLI_USE_RESULT);
if ($uresult) {
while ($row = $uresult-&fetch_assoc()) {
echo $row['Name'] . PHP_EOL;
$uresult-&close();
非缓冲查询方法二: pdo_mysql
$pdo = new PDO("mysql:host=dbname=world", 'my_user', 'my_pass');
$pdo-&setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$uresult = $pdo-&query("SELECT Name FROM City");
if ($uresult) {
while ($row = $uresult-&fetch(PDO::FETCH_ASSOC)) {
echo $row['Name'] . PHP_EOL;
非缓冲查询方法三: mysql
$conn = mysql_connect("localhost", "my_user", "my_pass");
= mysql_select_db("world");
$uresult = mysql_unbuffered_query("SELECT Name FROM City");
if ($uresult) {
while ($row = mysql_fetch_assoc($uresult)) {
echo $row['Name'] . PHP_EOL;
阅读余下内容
相关文章:}

我要回帖

更多关于 ddr4内存时序怎么看 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信