在webman里面引入第三方框架sabre/dav有方法吗?

icodex

问题描述

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这样的容器中来,并给它一个合适的端口。

谢谢大家。

83 0 0
0个回答

🔝