Php 从apachedavlockdb/WebDAV获取lockstate
我在windows服务器上运行带有mod_dav/mod_dav_fs的Apache Web服务器。 用户可以通过WebDAV编辑某些文件 到目前为止,WebDAV已正确设置并运行。。。 问题是,我如何确定当前是否以及哪些文件是通过WebDAV打开的 Apache将此信息写入其“DavLockDB”。 有没有办法读取该文件或找出当前锁定的文件 我已经通过php尝试过了:Php 从apachedavlockdb/WebDAV获取lockstate,php,apache,locking,webdav,Php,Apache,Locking,Webdav,我在windows服务器上运行带有mod_dav/mod_dav_fs的Apache Web服务器。 用户可以通过WebDAV编辑某些文件 到目前为止,WebDAV已正确设置并运行。。。 问题是,我如何确定当前是否以及哪些文件是通过WebDAV打开的 Apache将此信息写入其“DavLockDB”。 有没有办法读取该文件或找出当前锁定的文件 我已经通过php尝试过了: $fp = fopen($file, 'c'); if (!flock($fp, LOCK_EX|LOCK_NB, $woul
$fp = fopen($file, 'c');
if (!flock($fp, LOCK_EX|LOCK_NB, $wouldblock)) {
// lock not obtained
echo 'file maybe open';
}
else {
// lock obtained
echo 'file is free';
}
如果文件是在服务器上本地打开的,但如果文件是通过WebDAV打开的,则会得到正确的结果
有没有人有过类似的问题
问候
Thomas多年来,我一直与WebDAV联系在一起,对WebDAV感到沮丧,我经常需要能够识别锁定的文件,并偶尔解锁它们。我最近用PHP编写了一个小工具来实现这一点,您可以在上面看到 我的大部分答案都在网站上的&on中找到。我没有遇到使用DavLockDB的解决方案,而是通过正式途径将cURL请求发送到DAV服务器,就像真正的应用程序使用HTTP谓词获取我需要的有关文件或目录的信息一样 简而言之,您可以选择一个文件或目录作为端点并发送PROPFIND请求。如果端点是一个目录,您将获得一个资源(文件/目录)列表及其属性,这些资源(文件/目录)位于该目录下(可能位于该目录下,具体取决于您的深度设置)。如果端点是文件,则将获得文件属性。在这两种情况下,信息都以XML的形式返回,如果任何资源被锁定,则属性将包含一个LockToken 下面是一个PHP函数,您可以根据上面提到的存储库中的方法使用它:
function propfind() {
$location = 'https://example.com:8000' // ROUTE TO SERVER
$endpoint = '/webdav/'; // FINAL DESTINATION
$auth = 'user:pass'; // BASE64 ENCODED USERNAME:PASSWORD
$url = $location.$endpoint;
$host = parse_url($location, PHP_URL_HOST);
$ch = curl_init();
// FIX LOCALHOST SSL CERTIFICATE ISSUES
if ($_SERVER['SERVER_NAME'] == 'localhost') curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+'); // CREATE A STREAM TO SAVE THE VERBOSE CONNECTION DATA
curl_setopt($ch, CURLOPT_STDERR, $verbose);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: text/xml; charset="utf-8"',
'Host: '.$host,
'Authorization: Basic '.$auth,
'Depth: 1',
));
/*
// OPTIONALLY LIMIT THE RESPONSE TO SPECIFIC PROPERTIES
$xml = '<?xml version="1.0" encoding="utf-8" ?><D:propfind xmlns:D="DAV:"><D:prop><D:creationdate/><D:getlastmodified/><D:getcontentlength/></D:prop></D:propfind>';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
*/
$response = curl_exec($ch);
$curlInfo = curl_getinfo($ch);
rewind($verbose);
$verboseLog = stream_get_contents($verbose);
if(curl_error($ch)) {
return array('error'=>curl_errno($ch).': '.curl_error($ch), 'response'=>print_r($curlInfo,1), 'verbose'=>$verboseLog);
}
curl_close($ch);
return array($response, $verboseLog);
}
函数propfind(){
$location='1https://example.com:8000“//路由到服务器
$endpoint='/webdav//';//最终目的地
$auth='user:pass';//BASE64编码的用户名:密码
$url=$location.$endpoint;
$host=parse_url($location,PHP_url_host);
$ch=curl_init();
//修复本地主机SSL证书问题
if($_SERVER['SERVER\u NAME']=='localhost')curl\u setopt($ch,CURLOPT\u SSL\u VERIFYPEER,false);
curl_setopt($ch,CURLOPT_VERBOSE,true);
$verbose=fopen('php://temp“,“w+”);//创建一个流来保存详细的连接数据
curl_setopt($ch,CURLOPT_STDERR,$verbose);
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,'PROPFIND');
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组(
'内容类型:text/xml;charset=“utf-8”',
“主机:”。$Host,
“授权:基本”。$auth,
“深度:1”,
));
/*
//(可选)将响应限制为特定属性
$xml='';
卷曲设置($ch,卷曲设置桩,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
*/
$response=curl\u exec($ch);
$curlInfo=curl\u getinfo($ch);
倒带($verbose);
$verboseLog=stream\u get\u contents($verbose);
if(旋度误差($ch)){
返回数组('error'=>curl\u errno($ch)。':'.curl\u error($ch),'response'=>print\r($curlInfo,1),'verbose'=>verboseLog);
}
卷曲关闭($ch);
返回数组($response,$verboseLog);
}
示例响应可能是:
<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:">
<D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
<D:href>/webdav/test.xlsx</D:href>
<D:propstat>
<D:prop>
<lp1:resourcetype/>
<lp1:creationdate>2020-04-11T20:30:58Z</lp1:creationdate>
<lp1:getcontentlength>9853</lp1:getcontentlength>
<lp1:getlastmodified>Thu, 06 Aug 2020 16:17:05 GMT</lp1:getlastmodified>
<lp1:getetag>"123456-789b-ab12345cd67e89"</lp1:getetag>
<lp2:executable>T</lp2:executable>
<D:supportedlock>
<D:lockentry>
<D:lockscope><D:exclusive/></D:lockscope>
<D:locktype><D:write/></D:locktype>
</D:lockentry>
<D:lockentry>
<D:lockscope><D:shared/></D:lockscope>
<D:locktype><D:write/></D:locktype>
</D:lockentry>
</D:supportedlock>
<D:lockdiscovery>
<D:activelock>
<D:locktype><D:write/></D:locktype>
<D:lockscope><D:exclusive/></D:lockscope>
<D:depth>infinity</D:depth>
<ns0:owner xmlns:ns0="DAV:"><ns0:href>Username</ns0:href></ns0:owner>
<D:timeout>Second-896</D:timeout>
<D:locktoken>
<D:href>opaquelocktoken:a12bc34d-567e-8901-23d4-5ab6cd7e8f90</D:href>
</D:locktoken>
</D:activelock>
</D:lockdiscovery>
<D:getcontenttype>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</D:getcontenttype>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>
/webdav/test.xlsx
2020-04-11T20:30:58Z
9853
2020年8月6日星期四16:17:05 GMT
“123456-789b-ab12345cd67e89”
T
无穷
用户名
秒-896
不透明锁令牌:a12bc34d-567e-8901-23d4-5ab6cd7e8f90
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
HTTP/1.1200ok
请注意指示文件已锁定的条目。理论上,您可以递归地使用该函数来映射整个资源并突出显示任何锁定的文件
要解锁文件,您需要创建锁的用户的凭据。然后使用UNLOCK作为HTTP动词发送请求:
function unlock () {
$lockToken = 'opaquelocktoken:a12bc34d-567e-8901-23d4-5ab6cd7e8f90';
$location = 'https://example.com:8000' // ROUTE TO SERVER
$endpoint = '/webdav/'; // FINAL DESTINATION
$auth = 'user:pass'; // BASE64 ENCODED USERNAME:PASSWORD
$url = $location.$endpoint;
$host = parse_url($location, PHP_URL_HOST);
$ch = curl_init();
// FIX LOCALHOST SSL CERTIFICATE ISSUES
if ($_SERVER['SERVER_NAME'] == 'localhost') curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'UNLOCK');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Host: '.$host,
'Authorization: Basic '.$auth,
'Lock-Token: <'.$lockToken.'>',
));
$response = curl_exec($ch);
$curlInfo = curl_getinfo($ch);
if(curl_error($ch)) {
$unlockStatus = 'ERROR: '.curl_error($ch).print_r($curlInfo,1);
}
else {
$unlockStatus = array(
'status' => ($curlInfo['http_code'] == '204' ? 'ok' : 'Fail'),
'response' => htmlentities($response),
'curlInfo' => $curlInfo,
);
}
curl_close($ch);
return $unlockStatus;
}
功能解锁(){
$lockToken='opaquelocktoken:a12bc34d-567e-8901-23d4-5ab6cd7e8f90';
$location='1https://example.com:8000“//路由到服务器
$endpoint='/webdav//';//最终目的地
$auth='user:pass';//BASE64编码的用户名:密码
$url=$location.$endpoint;
$host=parse_url($location,PHP_url_host);
$ch=curl_init();
//修复本地主机SSL证书问题
if($_SERVER['SERVER\u NAME']=='localhost')curl\u setopt($ch,CURLOPT\u SSL\u VERIFYPEER,false);
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,'UNLOCK');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组(
“主机:”。$Host,
“授权:基本”。$auth,
“锁定令牌:”,
));
$response=curl\u exec($ch);
$curlInfo=curl\u getinfo($ch);
if(旋度误差($ch)){
$unlockStatus='ERROR:'.curl\u ERROR($ch).print\r($curlInfo,1);
}
否则{
$unlockStatus=数组(
'status'=>($curlInfo['http_code']='204'?'ok':'Fail'),
“响应”=>htmlentities($response),
“curlInfo”=>$curlInfo,
);
}
卷曲关闭($ch);
返回$unlockStatus;
}
注意:通过更手动的方式,您可以使用2个cURL命令从命令行获取属性并解锁文件:
// GET RESOURCE PROPERTIES
curl -X PROPFIND '{path-to-resource}' -H 'Authorization:Basic {base64 encoded username:password}' -H 'Depth:1'
// UNLOCK A LOCKED FILE
curl -X UNLOCK '{path-to-resource}' -H 'Authorization: Basic {base64 encoded username:password}' -H 'Lock-Token: <{lock-token-from-first-request}>'
<