Кракозябры при использовании метода file_save_from_url в 2.4.0

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 15 апреля 2016 в 09:36
Добрый день. Опишу симптомы, может быть кто-то встречал подобное, и поможет понять, что не так с сервером, так как на других сайтах все работает отлично.

Есть сайт на 2.4.0, есть парсер, он использует для копирования картинок метод file_save_from_url из \system\libs\files.helper.php При копировании картинки этим методом сервер зачем-то выводит ее на экран



И ладно бы проблема была только с картинками. Не устанавливаются дополнения в админке. После ввода реквизитов фтп получаем либо



либо опять таки кракозябры...

Проблема наблюдалась и в 2.3.0, обновлялись вручную.

С чем это может быть связано? Есть мысли? Кривая работа библиотеки curl?
#2 15 апреля 2016 в 09:42

При копировании картинки этим методом сервер зачем-то выводит ее на экран

Zau4man
Вероятно, если у вас в этот момент юзается CURL, то не устанавливается по какой то причине опция CURLOPT_RETURNTRANSFER.
Либо file_get_contents так странно себя ведет.
#3 15 апреля 2016 в 10:00

Вероятно, если у вас в этот момент юзается CURL

Fuze
он используется в методе file_save_from_url
  1. function file_save_from_url($url, $destination){
  2. if (!function_exists('curl_init')){ return false; }
  3. $dest_file = @fopen($destination, "w");
  4. $curl = curl_init();
  5. if(strpos($url, 'https') !== false){
  6. curl_setopt(CURLOPT_SSL_VERIFYHOST, 0);
  7. curl_setopt(CURLOPT_SSL_VERIFYPEER, false);
  8. }
  9. curl_setopt($curl, CURLOPT_URL, $url);
  10. curl_setopt($curl, CURLOPT_FILE, $dest_file);
  11. curl_setopt($curl, CURLOPT_HEADER, false);
  12. curl_exec($curl);
  13. curl_close($curl);
  14. fclose($dest_file);
  15. return true;
  16. }
а с картинкой специально написал просто тестовый экшн, без всяких запросов
  1. public function copyPoster($fcode){//копируем картинку в папку poster по годам
  2. $dest = $this->createPosterDir();
  3. file_save_from_url('http://st.kp.yandex.net/images/film_big/'.$fcode.'.jpg',$dest.$fcode.'.jpg');
  4. return $dest.$fcode.'.jpg';
  5. }
#4 15 апреля 2016 в 10:15
Попробуйте вот так:

  1. function file_save_from_url($url, $destination){
  2.  
  3. if (!function_exists('curl_init')){ return false; }
  4.  
  5. $dest_file = @fopen($destination, "w");
  6.  
  7. $curl = curl_init();
  8. if(strpos($url, 'https') !== false){
  9. curl_setopt(CURLOPT_SSL_VERIFYHOST, 0);
  10. curl_setopt(CURLOPT_SSL_VERIFYPEER, false);
  11. }
  12. curl_setopt($curl, CURLOPT_URL, $url);
  13. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  14. curl_setopt($curl, CURLOPT_FILE, $dest_file);
  15. curl_setopt($curl, CURLOPT_HEADER, false);
  16. curl_exec($curl);
  17. curl_close($curl);
  18. fclose($dest_file);
  19.  
  20. return true;
  21.  
  22. }
#5 15 апреля 2016 в 10:58
Fuze, спасибо. Кракозябры исчезли. Файл правда все равно не копируется, но это уже, наверно, права на папки.
#6 15 апреля 2016 в 11:07
Меня пугают такие вот пользователи у папок...



Получается как раз ручками к типу контента изображения добавляются (они лежат в папка с владельцем www), а в папку poster скрипт ничего скопировать не может (у нее владелец сам пользователь панели управления)…
#7 15 апреля 2016 в 11:10

Получается как раз ручками к типу контента изображения добавляются (они лежат в папка с владельцем www), а в папку poster скрипт ничего скопировать не может (у нее владелец сам пользователь панели управления)

Zau4man
www — это пользователь, под которым работает апач у вас. в папку poster копирование должно работать, т.к. на нее права 777. а вот если внутри еще папки создаются, то проверяйте какие права на них получаются.
#8 15 апреля 2016 в 11:20
Fuze, спасибо. Заменил рекурсивно права на подпапки на 777… И скопировалось.
Если не сложно, последний вопрос. В коде папки создаются с правами 777
  1. @mkdir($dest_dir, 0777, true);
на деле получается 755. Пинать техподдержку сервера?
#9 15 апреля 2016 в 11:23

на деле получается 755. Пинать техподдержку сервера?

Zau4man
Нагуглил. Надо добавить

  1. chmod($path, 0777);

В php есть функция umask() которая может сбросить этот показатель в ноль. Показатель umask восстанавливается после завершения скрипта.
Но лучше использовать функцию chmod после вызова mkdir.

#10 15 апреля 2016 в 11:28
Все завелось. Всем спасибо большое.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.