Я пытаюсь сделать PHP-скрипт, который загружает исполняемый файл с curl. Пока я могу скачать файл, но после загрузки файл не исполняется (т.е. если вы запускаете php wp-cli.phar
Ничего не произошло). Я понимаю, что это ожидаемое поведение для предотвращения угроз безопасности, поэтому как мне указать curl, что я хочу, чтобы загруженный файл рассматривался как исполняемый файл? Эквивалентная команда из командной строки: curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
Это мой код, который пытается реализовать вышеуказанную команду в php-скрипте, но полученный файл не является исполняемым:
set_time_limit(0);
$fp = fopen ('./wp-cli.phar', 'w+');
$ch = curl_init('https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar');
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Если вы хотите воспроизвести ошибку, создайте файл с именем a.php
с содержанием выше. Тогда беги php a.php
а потом беги php wp-cli.phar --info
Попробуйте этот код ниже, это то, что мы сейчас используем для загрузки файлов с URL.
public function downloadFile($url, $filepath){
$fp = fopen($filepath, 'w+');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
return (filesize($filepath) > 0)? true : false;
}
Других решений пока нет …