Php 是否可以从文件数据获取资源句柄?

Php 是否可以从文件数据获取资源句柄?,php,Php,我目前有一个函数,它接受一个csv文件,并从中返回一个数据数组。我希望对这个函数进行最小的修改,以获取文件数据,而不是文件本身 使用下面的代码,我希望从传入的数据而不是文件中获取资源句柄,以便保持函数的其余部分不变。这可能吗 public function returnRawCSVData($filepath, $separator = ',') { $file = fopen($filepath, 'r'); $csvrawdata = array(); //I WA

我目前有一个函数,它接受一个csv文件,并从中返回一个数据数组。我希望对这个函数进行最小的修改,以获取文件数据,而不是文件本身

使用下面的代码,我希望从传入的数据而不是文件中获取资源句柄,以便保持函数的其余部分不变。这可能吗

public function returnRawCSVData($filepath, $separator = ',')
{
    $file = fopen($filepath, 'r');
    $csvrawdata = array();

    //I WANT TO CHANGE $filepath to $file_data and get a resource from it to pass into fgetcsv below.

    while( ($row = fgetcsv($file,  $this->max_row_size, $separator, $this->enclosure)) != false ) {            
        if( $row[0] != null ) { // skip empty lines

        }
    }

    fclose($file);
    return $csvrawdata;
}

如果要传递文件句柄,可以将其视为:

$in_file = fopen('some_file.csv', 'r');
// Do stuff with input...

// Later, pass the file handle to a function and let it read from the file too.
$data = doStuffWithFile($in_file);

fclose($in_file);


function doStuffWithFile($file_handle)
{
    $line = fgetcsv($file_handle);
    return $line;
}

似乎您正在寻找一种从源文本创建新文件资源的方法

如果是这样,您可以在内存中创建文件资源,如下所示:

/**
 * Return an in-memory file resource handle from source text
 * @param string $csvtxt CSV source text
 * @return resource File resource handle
 */
public static function getFileResourceFromSrcTxt($csvtxt)
{
  $tmp_handle = fopen('php://temp', 'r+');
  fwrite($tmp_handle, $csvtxt);
  return $tmp_handle;
}

/**
 * Parse csv data from source text
 * @param $file_data CSV source text
 * @see self::getFileResourceFromSrcTxt
 */
public function returnRawCSVData($file_data, $separator = ',')
{
  $file = self::getFileResourceFromSrcTxt($file_data);
  $csvrawdata = array();

  while( ($row = fgetcsv($file,  $this->max_row_size, $separator, $this->enclosure)) != false ) {            
    if( $row[0] != null ) { // skip empty lines
      // do stuff
    }
  }

  fclose($file);
}
值得注意的是,您还可以使用“php://memory“代替”php://temp“--区别在于,‘内存’只在内存中存储内容,而‘临时’将在内存中存储内容,直到达到给定大小(默认值为2MB),然后透明地切换到文件系统


了解更多关于…

我是否正确理解您只是想让returnRawCSVData()函数接受已打开的文件资源句柄作为参数?或者您正在尝试从要传递到returnRawCSVData()中的csv源文本生成资源?@rdlowrey第二个文本这基本上就像获取文件数据、创建临时文件并正确获取句柄一样?这是我考虑过的另一种方式,但我试图避免任何类型的文件创建。但是您的解决方案更好,因为它是临时的。对——您从来不会用这种方式接触文件系统。处理临时数据比将其放在磁盘上然后删除要干净得多。如果有1000人使用此功能,您认为它会比创建一个真实文件、插入数据和获取句柄更耗费资源吗?在内存中执行此操作肯定比写入文件系统快得多。如果您有足够的RAM,并且源数据不是很大,我就不会期望出现问题。然而,即使情况并非如此,这也是php://temp 这真是太棒了——如果内存耗尽,它将透明地切换到将资源存储在文件系统上。因此,不,负载量不应该阻止您在实际的文件系统句柄上使用此解决方案。我会阅读关于这个主题的php文档的链接以获取更多信息。我有文件中的数据,所以我无法传递句柄。原来的函数就是这样做的。