sabre/dav是比較好用的webdav文件傳輸?shù)慕鉀Q方案,目前我有個(gè)項(xiàng)目里面有用到。我需要對(duì)每個(gè)使用它的人做一個(gè)登陸認(rèn)證。sabre/dav文檔里面有一個(gè)用外部回調(diào)鑒權(quán)的,我想直接用webman里的鑒權(quán)做回調(diào),這樣方便多用戶登陸使用,如果是用webman生成一個(gè)文件htdigest
文件的方式給sabre/dav去做認(rèn)證,這樣不會(huì)熱加載。因此我想把它移植進(jìn)來。
但是sabre/dav本身就是一個(gè)框架的東西了,比如我建立一個(gè)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();
日常調(diào)試運(yùn)行是用以下命令進(jìn)行
php -S 0.0.0.0:8080 dav.php
以上是可以直接運(yùn)行的。
但是當(dāng)我把它放進(jìn)process路徑,按onWorkerStart的規(guī)范寫
<?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' => []
],
啟動(dòng)后就會(huì)報(bào)There was no plugin in the system that was willing to handle this CLI method.
,這個(gè)出錯(cuò)跟直接php dav.php
是一樣的
像這種本身就是框架的,它可以直接在php-fpm里運(yùn)行,如何移植到workerman這樣的容器中來,并給它一個(gè)合適的端口。
謝謝大家。