Php 是否可以从文件数据获取资源句柄?
我目前有一个函数,它接受一个csv文件,并从中返回一个数据数组。我希望对这个函数进行最小的修改,以获取文件数据,而不是文件本身 使用下面的代码,我希望从传入的数据而不是文件中获取资源句柄,以便保持函数的其余部分不变。这可能吗Php 是否可以从文件数据获取资源句柄?,php,Php,我目前有一个函数,它接受一个csv文件,并从中返回一个数据数组。我希望对这个函数进行最小的修改,以获取文件数据,而不是文件本身 使用下面的代码,我希望从传入的数据而不是文件中获取资源句柄,以便保持函数的其余部分不变。这可能吗 public function returnRawCSVData($filepath, $separator = ',') { $file = fopen($filepath, 'r'); $csvrawdata = array(); //I WA
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文档的链接以获取更多信息。我有文件中的数据,所以我无法传递句柄。原来的函数就是这样做的。