Использование curl в качестве альтернативы файловому ресурсу fopen для fgetcsv
можно ли сделать curl, получить доступ к url-адресу и результату в качестве файлового ресурса? например, как это делает фопен.
мои цели:
- проанализировать файл CSV
- передать его fgetcsv
моя обструкция: fopen отключен
мой кусок кодов (в fopen)
$url = "http://download.finance.yahoo.com/d/quotes.csv?s=USDEUR=X&f=sl1d1t1n&e=.csv";
$f = fopen($url, 'r');
print_r(fgetcsv($f));
затем я пробую это на curl.
$curl = curl_init();
curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
curl_setopt($curl, CURLOPT_URL, $url);
$content = @curl_exec($curl);
curl_close($curl);
но, как обычно. $content уже возвращает строку.
теперь, возможно ли это для curl, чтобы вернуть его в качестве указателя на файловый ресурс? прямо как фопен? Использование PHP
моя ошибка
предупреждение: fgetcsv() ожидает параметр 1 будет ресурсом, булевым дается
спасибо
2 ответов
предполагая, что fopen is disabled
вы имеете в виду "allow_url_fopen
отключено", комбинация CURLOPT_FILE
и php://temp
сделать это довольно легко:
$f = fopen('php://temp', 'w+');
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FILE, $f);
// Do you need these? Your fopen() method isn't a post request
// curl_setopt($curl, CURLOPT_POST, true);
// curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
curl_exec($curl);
curl_close($curl);
rewind($f);
while ($line = fgetcsv($f)) {
print_r($line);
}
fclose($f);
в основном это создает указатель на "виртуальный" файл, и cURL сохраняет в нем ответ. Затем вы просто сбрасываете указатель на начало, и его можно рассматривать как если бы вы открыли его как обычно с помощью fopen($url, 'r');
вы можете создать временный файл с помощью fopen()
а то fwrite()
содержимое в него. После этого вновь созданный файл будет считываться с помощью fgetcsv()
. The tempnam()
функция должна обрабатывать создание произвольных временных файлов.
согласно комментариям на str_getcsv()
, пользователи без доступа к команде могут попробовать функцию ниже. Есть также другие подходы, в комментариях, убедитесь, что вы проверить их из.
function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\', $eol = '\n') {
if (is_string($input) && !empty($input)) {
$output = array();
$tmp = preg_split("/".$eol."/",$input);
if (is_array($tmp) && !empty($tmp)) {
while (list($line_num, $line) = each($tmp)) {
if (preg_match("/".$escape.$enclosure."/",$line)) {
while ($strlen = strlen($line)) {
$pos_delimiter = strpos($line,$delimiter);
$pos_enclosure_start = strpos($line,$enclosure);
if (
is_int($pos_delimiter) && is_int($pos_enclosure_start)
&& ($pos_enclosure_start < $pos_delimiter)
) {
$enclosed_str = substr($line,1);
$pos_enclosure_end = strpos($enclosed_str,$enclosure);
$enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
$output[$line_num][] = $enclosed_str;
$offset = $pos_enclosure_end+3;
} else {
if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
$output[$line_num][] = substr($line,0);
$offset = strlen($line);
} else {
$output[$line_num][] = substr($line,0,$pos_delimiter);
$offset = (
!empty($pos_enclosure_start)
&& ($pos_enclosure_start < $pos_delimiter)
)
?$pos_enclosure_start
:$pos_delimiter+1;
}
}
$line = substr($line,$offset);
}
} else {
$line = preg_split("/".$delimiter."/",$line);
/*
* Validating against pesky extra line breaks creating false rows.
*/
if (is_array($line) && !empty($line[0])) {
$output[$line_num] = $line;
}
}
}
return $output;
} else {
return false;
}
} else {
return false;
}
}