Существует ли способ получить доступ к строке как к дескриптору файла в php?

Я нахожусь на сервере, где я ограничен PHP 5.2.6, что означает, что str_getcsv не доступен мне. Я использую, вместо этого fgetcsv, который требует "Указателя правильного файла на файл, успешно открытый fopen (), popen (), или fsockopen ()". воздействовать на.

Мой вопрос - это: существует ли способ получить доступ к строке как к дескриптору файла?

Моя другая опция состоит в том, чтобы выписать строку к текстовому файлу и затем получить доступ к ней через fopen() и затем используйте fgetcsv, но я надеюсь, что существует способ сделать это непосредственно, как в жемчуге.

11
задан Erik 16 February 2010 в 21:50
поделиться

4 ответа

Если вы посмотрите примечания пользователя на странице руководства для str_getcsv , вы найдете это примечание от daniel , который предлагает эту функцию (цитата) :

<?php
if (!function_exists('str_getcsv')) {
    function str_getcsv($input, $delimiter = ",", $enclosure = '"', $escape = "\\") {
        $fiveMBs = 5 * 1024 * 1024;
        $fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
        fputs($fp, $input);
        rewind($fp);

        $data = fgetcsv($fp, 1000, $delimiter, $enclosure); //  $escape only got added in 5.3.0

        fclose($fp);
        return $data;
    }
}
?>

Кажется, она делает именно то, что вы просили: она использует поток, который указывает на временный дескриптор файла в памяти, для использования fgetcsv на нем.


См. Потоки ввода / вывода PHP для документации, среди прочего, об оболочке потока php: // temp .


Конечно, вы должны проверить, работает ли он у вас нормально, но, по крайней мере, это должно дать вам представление о том, как этого добиться; -)

21
ответ дан 3 December 2019 в 02:52
поделиться

Чтобы ответить на ваш общий вопрос, да, вы можете рассматривать переменную как файловый поток.

http://www.php.net/manual/en/function.stream-context-create.php

Ниже приводится копия нескольких разных комментариев к руководству по PHP (так что я не могу поручиться о том, насколько он готов к производству):

<?php
class VariableStream {
    private $position;
    private $varname;
    public function stream_open($path, $mode, $options, &$opened_path) {
        $url = parse_url($path);
        $this->varname = $url["host"];
        $this->position = 0;
        return true;
    }
    public function stream_read($count) {
        $p=&$this->position;
        $ret = substr($GLOBALS[$this->varname], $p, $count);
        $p += strlen($ret);
        return $ret;
    }
    public function stream_write($data){
        $v=&$GLOBALS[$this->varname];
        $l=strlen($data);
        $p=&$this->position;
        $v = substr($v, 0, $p) . $data . substr($v, $p += $l);
        return $l;
    }
    public function stream_tell() {
        return $this->position;
    }
    public function stream_eof() {
        return $this->position >= strlen($GLOBALS[$this->varname]);
    }
    public function stream_seek($offset, $whence) {
        $l=strlen(&$GLOBALS[$this->varname]);
        $p=&$this->position;
        switch ($whence) {
            case SEEK_SET: $newPos = $offset; break;
            case SEEK_CUR: $newPos = $p + $offset; break;
            case SEEK_END: $newPos = $l + $offset; break;
            default: return false;
        }
        $ret = ($newPos >=0 && $newPos <=$l);
        if ($ret) $p=$newPos;
        return $ret;
    }
}

stream_wrapper_register("var", "VariableStream");
$csv = "foo,bar\ntest,1,2,3\n";

$row = 1;
if (($handle = fopen("var://csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>

Конечно, для вашего конкретного примера есть более простые методы потока, которые можно использовать.

6
ответ дан 3 December 2019 в 02:52
поделиться
firefox "http://www.google.com/" &

Это работает для меня просто прекрасно. Попробуйте использовать кавычки и полный URL-адрес.

-121--4012983-

В документации Grails описан способ получения услуги в сервлете. Это может быть полезно, если вы можете получить те же объекты в вашем контексте:

ApplicationContext ctx = (ApplicationContext)ApplicationHolder.getApplication().getMainContext();
CountryServiceInt service = (CountryServiceInt) ctx.getBean("countryService");
String str = service.sayHello(request.getParameter.("name"));    
-121--3035729-

Вы можете использовать дескрипторы потока, такие как php ://memory для достижения того, что вы хотите. Просто откройте, напишите, перемотайте, и вы должны иметь возможность использовать fgetcsv.

0
ответ дан 3 December 2019 в 02:52
поделиться

Событие onsubmit в форме тэга

При использовании jQuery оно выглядит следующим образом:

$("#yourformtagid").submit(function () {
 ...
}
-121--2585266-

Нет ничего плохого в маршруте. Только не забудьте определить его в конце, после определения всех остальных маршрутов. Я бы также рекомендовал использовать маршруты RESTful и только если вы хотите, чтобы лучше искать URL использовать именованные маршруты. Не используйте map.connect . Вот несколько хороших прочтений о маршрутах Rails .

Вот как это может выглядеть:

map.resources :questions, :path_prefix => '/:username' do |question|
  question.resources :answers
end

map.resources :users

map.user '/:username', :controller => 'users', :action => 'show'

Просто черновик вы можете продлить.

-121--2823049-

К сожалению, это невозможно. Нельзя рассматривать последовательность как поток из файла. Вам действительно придется сначала записать последовательность в файл, а затем открыть этот файл с помощью fopen .

И теперь, со всей очевидностью, Вы рассматривали возможность модернизации?

-3
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: