作为PHP开发人员,并不需要担心内存管理,因为,PHP引擎在清理方面做得很出色,但有些时候,可能需要一个更舒适的运行环境,比如在很小的VPS上运行一个大型项目的时候,或者需要在小服务器上读取大型文件时。那么如何使用PHP读取大文件而不导致服务器崩溃?
1、衡量成功
衡量成功需要关注两个指标。首先是CPU的使用,PHP读取大文件的时间,第二个是内存的使用,PHP读取大文件执行需要多少内存,两者通常成反比,可以以内存使用为代价避免CPU的使用,反之亦然。在多进程或多线程PHP应用程序中,CPU和内存的使用都是重要的考虑因素。在传统的PHP体系结构中,当任何一个达到服务器的极限时,都会出现问题。在PHP中测量CPU的使用是不切实际的,最好的方式是测量内存的使用情况。
2、解决方法
可以采取许多方法来高效地读取文件。但有两种方法可以更好的使用PHP读取大文件而不导致服务器崩溃。
首先,同时读取和处理数据,或者根据读取的内容执行其他操作。每1万行读取一个文件并创建单独的排队处理作业,只需要在内存中保留至少1万行,并将其传递给排队的作业管理器。
例如:正在读一个文本文件,而文本文件是峰值内存使用量是100MB,如果读取文本文件的每一行,那么文本文件大小不变的情况下,峰值内存使用量可能只有400KB,即使把文本文件分割成几千块,仍然只使用400KB内存。
其次,转换数据流,而不需要真正访问数据。可以压缩一个特别大的API响应的内容,不用在乎内容是什么,但可以确保内容以压缩形式备份。这是在不需要对数据进行操作的情况下,可以将文件数据从一个文件传递到另一个文件。例如:正在读取数据库文件,而文件内存使用量是100MB,常规方法读取可能需要满足100MB方可,而通过压缩打包的方式读取可能只需要20MB,这也像下载游戏客户端一样,完成下载的文件可能只需要1GB,而安装完成后的文件就是4-5GB了。
上述就是使用PHP读取大文件而不导致服务器崩溃的方法,虽然这一问题并不经常遇见,但在处理大型文件时很容易出错,如果不小心内存的使用,就很容易让整个服务器崩溃。而通过上述方法能够更多地思考如何高效地读取和编写大型文件。并避免使用错误的方法导致PHP读取大文件而导致服务器崩溃。
我来说两句