gpt4 book ai didi

php - PHP 是否将连续的 fseek 命令默默地优化为一个 fseek 命令?

转载 作者:可可西里 更新时间:2023-11-01 13:00:00 26 4
gpt4 key购买 nike

我正在运行 Windows 7 - 64 位,最新的 XAMPP 版本具有 32 位 PHP 版本。

关于测试http://php.net/manual/en/function.fseek.php#112647对于一个非常大的文件(比 PHP_MAX_INT 2147483647 大),我现在很确定,在文件指针上执行之前,连续跟随的 fseeks 被汇总。

我有两个问题:

  1. 我能否以合理的方式(或仅使用上面链接中提到的解决方法)打破这个总结?

  2. 这种聚合是发生在 PHP 中(正如我假设的那样,尽管我不知道在 PHP 中的什么位置)还是发生在 Windows 7 中?

Answering myself: Trying two workarounds with multiple seeks didn't work on my system. Instead they put the filepointer to different positions at under PHP_MAX_INT. (32-bit PHP only can seek up to PHP_MAX_INT + 8192. Reading from there on is still possible, but I don't know how far.)

Therefore the question is obsolete for my specific case, as 32-bit PHP only can seek up to PHP_MAX_INT + 8192, whatever you do. I leave the question, because two people voted it up, and might be interested in a general answer.

我在这里提交了错误报告:
https://bugs.php.net/bug.php?id=69213
结果:对于 64 位 PHP 构建,它可能会工作,但我没有尝试。

最佳答案

事实并非如此。它实际上做了一些甚至更笨的事情。这是 PHP 源代码的片段:

      switch(whence) {
case SEEK_CUR:
offset = stream->position + offset;
whence = SEEK_SET;
break;
}

这是 PHP 的 fseek 实现的核心。这里发生的事情是:如果您告诉 PHP 从当前位置开始查找,它会将其转换为从文件开头开始的“等效”查找。这仅在偏移计算没有溢出时有效;如果是,那么 offset 是一个带符号的整数,所以这是未定义的行为。

好吧,这是因为 PHP 在内部缓冲流,所以它们需要做一些事情。但不一定非要这样。

您可能最好尝试使用一种真正按您的要求行事的语言来完成您的工作。

关于php - PHP 是否将连续的 fseek 命令默默地优化为一个 fseek 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28964140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com