我想编写脚本:用于在文件加载中查找特定字符串的PHP脚本
是否可以从其他ftp服务器读取数千个文本文件的内容而无需实际下载这些文件(ftp_get)?
如果没有,将下载ONCE - >如果已经存在= skip / filesize不同= redownload - >搜索某些字符串 - > ... 是最简单的选择吗?
答案 0 :(得分:3)
如果启用了URL fopen包装,那么file_get_contents
可以解决问题,您可以不需要保存服务器上的文件。
<?php
$find = 'mytext'; //text to find
$files = array('http://example.com/file1.txt', 'http://example.com/file2.txt'); //source files
foreach($files as $file)
{
$data = file_get_contents($file);
if(strpos($data, $find) !== FALSE)
echo "found in $file".PHP_EOL;
}
?>
[编辑]:如果只能通过FTP访问文件:
在这种情况下,你必须这样使用:
$files = array('ftp://user:pass@domain.com/path/to/file', 'ftp://user:pass@domain.com/path/to/file2');
答案 1 :(得分:1)
如果您要在下载文件后存储文件,那么您可以更好地下载或更新所有文件,然后搜索它们以查找字符串。
最佳方法取决于您将如何使用它。
如果您在搜索文件后要删除这些文件,那么您可能还需要跟踪搜索的文件及其文件日期信息,以便稍后再次搜索时,不会浪费时间搜索自上次检查后没有改变的文件。
当您处理这么多文件时,请尝试缓存任何有助于您的程序在下次运行时更有效的信息。
答案 2 :(得分:1)
PHP的内置文件阅读功能,例如fopen()
/ fread()
/ fclose()
和file_get_contents()
支持FTP URLs,如下所示:
<?php
$data = file_get_contents('ftp://user:password@ftp.example.com/dir/file');
// The file's contents are stored in the $data variable
如果您需要获取目录中的文件列表,可能需要查看opendir()
,readdir()
和closedir()
,我非常确定支持FTP网址。
一个例子:
<?php
$dir = opendir('ftp://user:password@ftp.example.com/dir/');
if(!$dir)
die;
while(($file = readdir($dir)) !== false)
echo htmlspecialchars($file).'<br />';
closedir($dir);
答案 3 :(得分:0)
如果您可以通过SSH连接到该服务器,并且您可以安装新的PECL(和PEAR)模块,那么您可以考虑使用PHP SSH2。 Here是一个关于如何安装和使用它的好教程。这是FTP的更好替代方案。但如果不可能,那么您唯一的解决方案就是file_get_content('ftp://domain/path/to/remote/file');
。
** 更新 **
以下是SSH客户端的仅PHP实现:SSH in PHP。
答案 4 :(得分:0)
使用FTP,您将始终需要下载以进行检查。
我不知道你拥有什么样的带宽以及文件有多大,但这可能是一个有趣的用例,可以从像Amazon EC2或谷歌应用程序(如果你可以下载)的云中运行时间限制中的文件)。
在EC2案例中,然后启动服务器一小时以检查文件中的更新,然后再将其关闭。这将每月花费几美元,并避免您可能升级您的线路或托管合同。
答案 5 :(得分:0)
如果这是一个常规任务,那么可能值得使用一个简单的队列系统,这样你就可以一次运行多个进程(将极大地提高速度)这将涉及两个步骤:
处理脚本将包含简单的功能(在循环中执行)
ftp_connect
do
item = next item from queue
$contents = file_get_contents;
preg_match(.., $contents);
while (true);
ftp close
然后,您可以在理论上通过命令行分叉多个进程,而无需担心竞争条件。
这种方法可能最适合于crons / batch处理,但它也可能适用于这种情况。