sabre/dav是比较好用的webdav文件传输的解决方案,目前我有个项目里面有用到。我需要对每个使用它的人做一个登陆认证。sabre/dav文档里面有一个用外部回调鉴权的,我想直接用webman里的鉴权做回调,这样方便多用户登陆使用,如果是用webman生成一个文件htdigest
文件的方式给sabre/dav去做认证,这样不会热加载。因此我想把它移植进来。
但是sabre/dav本身就是一个框架的东西了,比如我建立一个dav.php:
#!/usr/bin/env php
<?php
require_once __DIR__ . '/vendor/autoload.php';
ini_set('display_errors', 'on');
error_reporting(E_ALL);
use Sabre\DAV;
$publicDir = 'public';
$tmpDir = 'runtime/tmp';
$rootDirectory = new DAV\FS\Directory($publicDir);
$server = new DAV\Server($rootDirectory);
$server->setBaseUri('/');
$lockBackend = new DAV\Locks\Backend\File($tmpDir.'/locksdb');
$lockPlugin = new DAV\Locks\Plugin($lockBackend);
$server->addPlugin($lockPlugin);
$server->addPlugin(new DAV\Browser\Plugin());
$server->exec();
日常调试运行是用以下命令进行
php -S 0.0.0.0:8080 dav.php
以上是可以直接运行的。
但是当我把它放进process路径,按onWorkerStart的规范写
<?php
namespace process;
use Workerman\Worker;
use Workerman\Events\EventInterface;
use Workerman\Lib\Timer;
use Sabre\DAV;
/**
* Class FileMonitor
* @package process
*/
class Webdav
{
public function onWorkerStart()
{
$publicDir = 'public';
$tmpDir = 'runtime/tmp';
$rootDirectory = new DAV\FS\Directory($publicDir);
$server = new DAV\Server($rootDirectory);
$server->setBaseUri('/');
$lockBackend = new DAV\Locks\Backend\File($tmpDir.'/locksdb');
$lockPlugin = new DAV\Locks\Plugin($lockBackend);
$server->addPlugin($lockPlugin);
$server->addPlugin(new DAV\Browser\Plugin());
$server->exec();
}
}
config/process.php里面增加:
// Dav Server
'webdav' => [
'handler' => process\Webdav::class,
'listen' => 'http://0.0.0.0:8080',
'count' => 1,
'constructor' => []
],
启动后就会报There was no plugin in the system that was willing to handle this CLI method.
,这个出错跟直接php dav.php
是一样的
像这种本身就是框架的,它可以直接在php-fpm里运行,如何移植到workerman这样的容器中来,并给它一个合适的端口。
谢谢大家。