我在Windows共享文件夹中具有扩展名为.msg的文件,而我的php服务器是Linux(LAMP服务器).我正在尝试编写一个PHP脚本,该脚本只计算Windows共享文件夹上.msg文件的数量.
我正在使用smbclient类,这是我写的:
<?php
require_once ('smbclient.php');
$smbc = new smbclient ('//192.168.10.14/reservations', 'user', 'pass');
$handle = popen ($smbc);
$files = glob($handle . '*.msg');
$filecount = count( $files );
echo $filecount;
?>
但是,我总是得到0作为输出,但是有200多个文件.
解决方法:
您不能像这样处理手柄.如果它是popen返回的实际资源,则实际上您正在尝试尝试遍历Resource(12)/ *.msg(这意味着smbclient :: __ toString()将需要返回protocol:// username:password @ host / the / share / url,并且需要自动注册协议的流包装).
但是即使那样,它也不会起作用,因为glob仅适用于文件系统中存在的事物(因此实际上需要将其挂载)……SPL的GlobIterator似乎也是如此.
至少,您需要遍历每个文件并根据您的模式检查名称.因此,请记住,根据网络连接和共享上文件/目录的数量,此时任何解决方案都将变慢.
由于我不知道您正在使用的smb客户端的代码,您使用的不适,请举一个我确实知道如何使用的示例,它可以工作. munkie/samba
是一个PHP SMB客户端,是系统smbclient的相应流包装器,因此您将需要使用与流一起使用的文件系统功能来利用它:
仅使用PHP(和应该内置的SPL)
使用SPL iterators,我们可以简化递归读取目录并搜索文件名的工作:
// assuming you installed via composer so use its autoloder
$autoloader = require_once('vendor/autoload.php');
use Samba\SambaStreamWrapper;
SambaStreamWrapper::register();
$dir = new RecusrsiveDirectoryIterator(new DirectoryIterator(
'smb://username:password@192.168.10.14/reservations'
));
$finder = new RegexIterator($dir, '#^.+\.msg$#i', RecursiveRegexIterator::MATCH);
$count = 0;
foreach($finder as $match) {
$count++;
}
echo $count;
使用非常方便的symfony / finder组件
symfony/finder
component使我们的工作变得更轻松,并且隐秘性降低.除了支持glob和正则表达式搜索模式外,它还实现了Countable,因此我们可以调用$var-> count()来获取计数,而不是循环遍历结果并手动对其进行计数(尽管在内部它仍然需要遍历结果以计数).它还使更复杂的搜索更易于使用.听起来现在还不是您需要的支持,但是稍后可能会出现:
// assuming you installed via composer so use its autoloder
$autoloader = require_once('vendor/autoload.php');
use Samba\SambaStreamWrapper;
use Symfony\Component\Finder\Finder;
SambaStreamWrapper::register();
$finder = new Finder();
$finder
->files()
->name('*.msg')
->in('smb://username:password@192.168.10.14/reservations');
// YAY Countable!
echo $finder->count();
您在这里的另一种选择是实际安装共享,然后使用glob(),GlobIterator或symfony / finder.但是,这可能会有些棘手,具体取决于您将其用作什么的性质以及您打算如何进行安装… Its been delved into a bit here.
最后,如果这些是邮箱中的电子邮件,则最好使用邮箱库/组件(如Zend_Mail
)连接并计算邮件,这会更好.