【问题标题】:PHP thread can't unlink files?PHP线程无法取消链接文件?
【发布时间】:2015-04-23 19:06:24
【问题描述】:

当创建一个新的 PHP 子线程时,它变得无法使用 unlink() 删除文件。这种限制有充分的理由还是我忘记了什么? 我穿了:

警告:取消链接(下载/1e6f6fa1c0552a1af9058f10216b40e8):没有这样的 文件或目录

虽然文件是在目标文件夹中创建的,但当我在线程函数之外运行相同的命令时,它会按原样删除文件。

//多线程类

<?php    
class download extends Thread {
public $i;
    public $res;
public function __construct($s){
    $this->i = $s;
}
public function run() {
try{
    $url = "http://my.link.com/{$this->i}";
    set_time_limit(0);
    $id = md5(uniqid());
    $tempName = md5($id.time());
    $tmp = "downloads/{$tempName}";
    $fp = fopen (dirname(__FILE__) . '/'.$tmp, 'w+');
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 50);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
    require('scanner.php');
    $results = scanfiles($tmp);
    unlink($tmp);
    $this->res = $results;
}catch(Exception $e){
    $this->res = '0';
}}} ?>

【问题讨论】:

  • 请包含您的代码
  • 有一个很好的理由 - 即您在打开和取消链接的文件路径上犯了一个错误。为什么要混合相对路径和绝对路径?

标签: php multithreading


【解决方案1】:

在 fopen 中,您传递的是绝对路径 (dirname(__FILE__) . "/{$tmp}"),而在 unlink 相对路径中,只需在任何地方使用绝对路径,它应该可以工作。顺便说一句,自 PHP 5.3 起,您可以只使用 __DIR__ 而不是 dirname(__FILE__)

【讨论】:

  • 我曾经在没有线程的情况下运行相同的代码并且它工作正常,然后我将它移到线程类中,它就崩溃了。
  • 这解决了问题,虽然我真的不知道为什么。谢谢。
  • 我对 pthread 没有任何经验,无论如何,如果它是真正的线程,那么它应该不是问题。当您尝试在没有线程的情况下运行此代码时,它是否位于同一文件中?我的意思是相对路径将相对于主脚本,而不是包含文件。
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 2012-08-05
相关资源
最近更新 更多