小编inv*_*sal的帖子

致命错误:内存不足,但我确实有足够的内存(PHP)

由于我的问题越来越长,我决定重新编写整个问题,以使其更好更短.

我在具有8GB内存的专用服务器上运行我的网站.我完全清楚我需要提高php.ini设置的内存限制.我把它从128M设置为256M并设置为-1.问题仍然是持久性.

致命错误:第81行的D:\ www\football\views\main.php内存不足(分配786432)(试图分配24576个字节)

内存不足没有意义,因为它说只分配了786432个字节,它需要24576个字节.

786432字节只有768千字节,相当小.

提示

  • 错误发生在非常随机的行上.它在第81行并不总是错误.
  • 在高峰时段,Apache只需要大约500mb的内存.我还有6GB备用.
  • 没有无限循环.
  • 该脚本占用1,042,424字节.从中获取此号码echo memory_get_peak_usage();
  • MySQL的结果集很小(最多12行,纯文本,没有blob数据)
  • (重要)如果我每两天重启一次Apache,则错误消失.它通常发生在Apache运行超过2天的时候.
  • 我已经包含了脚本的分析,你可以在这里得到它.
  • 此专用服务器仅用于运行一个网站.该网站是一个高流量的网站,平均每分钟有1,000名访客.在高峰时段,将有1,700到2,000名访客同时访问.

服务器规格

操作系统:Windows 2008 R2 64位
CPU:Intel Core i5 - 4核
RAM:8 GB
Apache 2.2
PHP 5.3.1
存储:2 x 1 TB硬盘
带宽:每月10 TB

我终于调整并解决了问题,我想在此分享我所做的改进:

  1. favicon.ico失踪了我的路线引擎搞砸了.虽然我的路由引擎非常小,但通过包含favicon.ico,它有助于通过不运行我的路由引擎来减少内存使用.我的网站的大部分内容都有它,我忘了把它放在这个新的部分.
  2. 限制有MaxRequestPerChild帮助.在我的其他专用服务器中,我MaxRequestPerChild有限.对于这台服务器,我将其设置为0.我一直认为每个脚本都是隔离的.让我们说如果我的脚本运行800kb.完成后,Apache或PHP应该释放800kb内存.看起来它不会这样工作.有限MaxRequestPerChild确实有助于防止内存泄漏,通过在有限MaxRequestPerChild的旧进程死亡后创建新进程.这是我的新设置.

    ThreadsPerChild      1500
    MaxRequestsPerChild  10000 
    
    Run Code Online (Sandbox Code Playgroud)
  3. ob_flush();确实减少了更多的内存.它没有多大帮助,但每一点优化都有帮助.

  4. xdebug尝试回答这个问题的人建议我使用过以前从未使用过的东西.我不得不说这是一个很好的工具,我已经优化了一些东西,使它运行得更快.
  5. 我已经禁用了一些不必要的Apache模块.我试图逐个禁用它并留下几天测试,以确保它在我禁用另一个之前完美运行.我现在有所有不必要的PHP扩展禁用.
  6. 我在这个服务器中的大多数脚本都使用传统方式(没有模板,没有数据库层,纯PHP,HTML和遗留mysql_*函数).说实话,它运行速度非常快,使用的内存极小.但是,随着网站越来越长,维护脚本并不容易.我试图将网站的某些部分转换为适当的框架(我自己的小框架).之所以我使用自己的框架,因为它很小(整个框架只有3kb,只包括我需要的).
  7. 切换到IIS7.5完全解决了这个问题.

php memory

60
推荐指数
6
解决办法
10万
查看次数

将列表分成三个列表,使它们的总和彼此接近

假设我有一个数字S = [6,2,1,7,4,3,9,5,3,1]的数组.我想分成三个数组.数组的顺序和这些数组中的项目数无关紧要.

假设A1,A2和A3是子阵列.我想最小化功能

f(x) = ( SUM(A1) - SUM(S) / 3 )^2 / 3 +
       ( SUM(A2) - SUM(S) / 3 )^2 / 3 +
       ( SUM(A3) - SUM(S) / 3 )^2 / 3
Run Code Online (Sandbox Code Playgroud)
  • 我不需要最佳解决方案; 我只需要足够好的解决方案.
  • 我不想要一个太慢的算法.我可以用一些速度换取更好的结果,但我不能交易太多.
  • S的长度约为10至30.

为什么

为什么我需要解决这个问题?我希望将盒子很好地排列成三列,这样每列的总高度就不会相差太大.

在此输入图像描述

我试过了什么

我的第一直觉是使用贪心.结果并不是那么糟糕,但它无法确保最佳解决方案.有没有更好的办法?

s = [6, 2, 1, 7, 4, 3, 9, 5, 3, 1]
s = sorted(s, reverse=True)

a = [[], [], []]
sum_a = [0, 0, 0]

for x in s:
    i = sum_a.index(min(sum_a))
    sum_a[i] += x
    a[i].append(x) …
Run Code Online (Sandbox Code Playgroud)

python algorithm

30
推荐指数
2
解决办法
1909
查看次数

Shellsort,2.48 ^(k-1)vs Tokuda的序列

介绍

Shellsort是一个有趣的排序算法,我刚才遇到过.最令人惊讶的是,不同的间隙序列可以显着提高算法的速度.我做了一些阅读(不广泛),似乎Tokuda的序列被推荐用于实际应用.

另一个有趣的部分是比率2.20~2.25的顺序往往更有效.所以我做了一个小搜索,考虑了从2.20到2.50的比率序列,并尝试搜索哪个比率可以表现平均好.我遇到了这个比例:2.48在许多不同的试验中看起来平均表现良好.

然后,我想出了序列发生器:2.48 k-1(让它称之为248序列)并试图将它与Tokuda的序列进行比较.事实证明,它们的平均速度相等.248个序列倾向于使用稍多的比较数.

基准方法

  • 我使用比较次数和交换次数,而不是使用毫秒作为度量.
  • 我按照以下阵列大小(50,000; 100,000; 200,000; 300,000; 500,000; 1,000,000)进行了100次试验,并跟踪它们的比较次数和交换次数.
  • 以下是我的数据(此处为CSV格式).
  • 完整代码:http://pastebin.com/pm7Akpqh

问题

我知道我可能错了,这就是为什么我来这里寻求更有经验的程序员的更多意见.如果你没有得到问题,这是我的问题:

  • 2.48 k-1和Tokuda的序列一样好吗?
  • 如果它与Tokuda的序列一样好,使用它会更实用,因为2.48 k-1序列比Tokuda的序列更容易生成.

248 Sequence:
  ROUNDUP ( 2.48(k-1) )
  eg: 1, 3, 7, 16, 38, 94, 233, 577, 1431, 3549, 8801, 21826, ...

Tokuda's Sequence
  ROUNDUP ( (9k - 4k) / (5 * 4k - 1) )
  eg: 1, 4, 9, 20, 46, 103, 233, 525, 1182, 2660, …

c# sorting algorithm shellsort

10
推荐指数
1
解决办法
1193
查看次数

如何禁用OUTFILE和INFILE?

从我的理解OUTFILEINFILE启用是非常危险的.任何允许其他人从系统中写入和读取文件的东西对我来说都是危险的,因为我的服务器正在托管一个公共网站.我知道最好的解决方案是使用我的代码来防止SQL注入,但人类有时会犯错误.所以,我想限制我的PHP中使用的用户访问非常有限.如果出现问题,损害将最小化.

如何禁用OUTFILEINFILE

mysql

7
推荐指数
1
解决办法
3762
查看次数

使用PHP将对象插入Google云端存储

说实话,我对使用PHP的Google云端存储文档缺乏感到非常沮丧.我在这里发现的大部分内容(Stackoverflow)都已过时.

这是我的尝试:

$postbody = array('data' => file_get_contents('e.png'));
$gso = new Google_Service_Storage_StorageObject();
$gso->setName('testing');
$gso->setContentType('images/png');

$service->objects->insert($bucket_name, $gso, $postbody);
Run Code Online (Sandbox Code Playgroud)

错误消息

(400)上传请求必须发送到/ upload/*.将请求重新发送到同一路径,但使用/ upload前缀.

从谷歌云存储JSON API,我知道我需要使用upload/storage/v1/b/bucket_name/o而不是storage/v1/b/bucket_name/o,但我如何使用谷歌云存储PHP客户端API?

php google-cloud-storage

7
推荐指数
1
解决办法
1729
查看次数

使用mod_rewrite从一个目录重定向到另一个目录

以下是我的目录结构:

admin\
controls\
images\
media\
lib\
models\
views\
index.php
.htaccess
Run Code Online (Sandbox Code Playgroud)

以下是我的.htaccess

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php
Run Code Online (Sandbox Code Playgroud)

我希望/ admin/images中的所有内容都等于根目录中的/ images.例如:http://www.example.com/admin/images/example.pnghttp://www.example.com/images/example.png相同

我的.htaccess问题是: 它转到index.php而不是将管理员/图像镜像到images /


RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php
Run Code Online (Sandbox Code Playgroud)

.htaccess mod-rewrite

6
推荐指数
1
解决办法
2万
查看次数

了解MyISAM记录结构

我试图了解MyISAM如何实际存储其记录以及在记录插入和记录删除后如何维护其结构.我看过以下链接:

我想确定我是否理解正确,如果不对,请纠正我.

固定大小的记录

MyISAM固定大小的记录

  • 删除标记确定是删除还是不删除记录.
  • 记录标题保存行的哪一列包含NULL值
  • 数据长度是固定的.

可变大小的记录

在此输入图像描述

  • 删除标记替换为BLOCK_DELETED块类型
  • 记录头保存数据长度和未使用数据的长度

在此输入图像描述

  • 单个记录可以分成由溢出指针连接的多个块.

删除

在此输入图像描述

  • 对于可变大小的记录,将块类型更改为BLOCK_DELETED
  • 通过使新删除的记录的先前指针指向上次删除的记录来维护所有已删除记录的双链表.然后,最后删除的记录的下一个指针指向新删除的记录.
  • 对于固定大小的记录,只需将删除标记更改为已删除.(不确定他们是否使用双链表来连接所有已删除的记录和固定大小的记录)

插入

  • 如果没有未使用的空间(已删除的记录),请将数据附加到文件的末尾
  • 如果有未使用的空间适合新插入的记录,请在此处写入新记录.
  • 如果有未使用的空间远远大于新插入的记录,则拆分为两个记录:新记录和已删除记录.
  • 如果有未使用的空间小于新插入的记录,则在那里写入数据,有溢出指针指向其他块的未经处理的数据.

更新

  • 如果用户使用更长的数据更新现有数据会怎样?MyISAM会将记录标记为已删除并找到适合新数据的位置,或者只是使用溢出指针指向不合适的数据?

再回顾一下这个问题

我想确定我是否理解正确,如果不对,请纠正我.

其他问题

  • 如果表已被删除并插入很多次,因为记录结构可能充满溢出指针和未使用的空间,它会非常低效吗?

mysql database architecture myisam

6
推荐指数
1
解决办法
1538
查看次数

如何以一定的随机性对函数进行单元测试

我有返回 0 到 6 之间的三个随机元素数组的函数。它确保所有元素不能具有相同的值(您可以有两个具有相同值的元素,但不能是三个)。下面是一个示例代码。

public function getRandom() {
    $array = array(0, 0, 0);
    do {
        $array[0] = rand(0, 6);
        $array[1] = rand(0, 6);
        $array[2] = rand(0, 6);
    } while(($array[0] == $array[1]) && ($array[0] == $array[2]));
    return $array;
}
Run Code Online (Sandbox Code Playgroud)

我对单元测试有点陌生,唯一能想到的就是测试这个

  1. 测试此函数 1,000 次并检查它是否返回 0 到 6 之间的数据,并且所有三个元素不能具有相同的值。
  2. 找到一种方法来覆盖函数 rand() 以便它返回我们想要的:
    • 返回使所有三个元素具有相同值的值,然后返回具有相同值的两个元素的值。然后,返回具有不同值的所有元素的值。

我想知道是否有任何方法或我的哪种方法更适合这种情况。

php phpunit unit-testing

4
推荐指数
1
解决办法
3144
查看次数

通过PHP cURL将文档添加到Apache Solr

我不知道我做错了什么.记录没有添加.

这是我的代码:

$ch = curl_init("http://127.0.0.1:8983/solr/collection1/update/json?commit=true");

$data = array(
    "add" => array( "doc" => array(
        "id"   => "HW132",
        "name" => "Hello World"
    ))
);
$data_string = json_encode($data);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

$response = curl_exec($ch);
Run Code Online (Sandbox Code Playgroud)

这是我从索尔得到的回应:

{"responseHeader":{"status":0,"QTime":4}}
Run Code Online (Sandbox Code Playgroud)

php curl solr

4
推荐指数
1
解决办法
4477
查看次数

将玩笑期望与排毒期望混合

如何将 Jest expect 与 Detox expect 混合使用?这是我尝试做的。似乎expect已经盖过了笑话expect

await mockServer.mockAnyResponse({
    httpRequest: {
      method: 'POST', 
      path: '/api/register',
    },
    httpResponse: {
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        token: 'xxx',
      }),
    }
});

await element(by.id('name')).typeText('Robert');
await element(by.id('password')).typeText('123456');
await element(by.id('register')).tap();

// Check if endpoint has been called
let result = await mockServer.checkIfRegisterEndPointHasBeenCalled();
expect(result).toBe(true); // <-- how to do something like this?
Run Code Online (Sandbox Code Playgroud)

jestjs react-native detox

4
推荐指数
1
解决办法
986
查看次数

stdClass和匿名函数

我可以使用匿名函数执行此操作

 $func = function() {
      return "Hello World";
 };
 var_dump($func());
Run Code Online (Sandbox Code Playgroud)

但是,我不能这样做

$namespace->func = function() {
      return "Hello World";
 };
 var_dump($namespace->func());
Run Code Online (Sandbox Code Playgroud)

我会得到这个错误

调用未定义的方法stdClass

到目前为止我发现的解决方法是使用另一个变量

$temp = $namespace->func;
var_dump($temp());
Run Code Online (Sandbox Code Playgroud)

有没有办法可以在一行中完成?

php stdclass

3
推荐指数
1
解决办法
340
查看次数

是O(n ^ 2)还是O(1)?

这种独特的字符串函数的执行时间是否从简单的O(n ^ 2)方法中减少了?

这个问题有很多有趣的讨论让我想知道我们是否对算法设置了一些门限,是否会改变Big-O的运行时间复杂度?例如:

void someAlgorithm(n) {
    if (n < SOME_THRESHOLD) {
         // do O(n^2) algorithm
    }
}
Run Code Online (Sandbox Code Playgroud)

它是O(n 2)还是O(1).

algorithm

1
推荐指数
1
解决办法
173
查看次数