У меня есть большой список Urls в html файле для изображений примерно так:
<a href="http://example.com/image1.jpg">image1</a>
<a href="http://example.com/image2.jpg">image2</a>
<a href="http://example.com/image3.jpg">image3</a>
<a href="http://example.com/image4.jpg">image4</a>
<a href="http://example.com/image5.jpg">image5</a>
<a href="http://example.com/image6.jpg">image6</a>
<a href="http://example.com/image7.jpg">image7</a>
Около 50 000 изображений
Я хочу сделать небольшой скрипт, который может скопировать все изображения на мой сервер, чтобы я мог их использовать:
http://Mywebsite.com/images/image1.jpg
http://Mywebsite.com/images/image1.jpg
http://Mywebsite.com/images/image1.jpg
...
Я хочу сделать цикл, и каждый Url в списке должен быть удален после того, как изображение будет скопировано успешно, потому что иногда, если страница разбивается при загрузке или что-то, я могу продолжить цикл без перезаписывания или чтения снова, если есть лучшее решение, чтобы не перезаписывать и прочитайте url снова, пожалуйста, скажите мне.
Я бы создал скрипт, который читает вашу строку html файла в строке.
Вы можете сделать это с помощью fopen
и fgets
.
fopen("path/to/some/file", "r");
while ( ( $line = fgets( $handle ) ) !== false )
{
// do somehting with $line
}
Таким образом, файл не просто анализируется в памяти, поэтому вам не нужно беспокоиться о размере
Затем после разбора каждой строки я записываю файл блокировки, содержащий текущий номер строки/индекс. Поэтому, если ваш скрипт сработает и вы перезапустите его, итерация просто пропускает каждую строку, пока текущий индекс не станет выше индекса из файла блокировки.
сценарий
Это может сработать, но, в конце концов, не следует просто копировать все. Но я надеюсь, что это поможет вам найти решение.
#!/usr/bin/env php
<?php
// I DID NOT TEST THIS!
// but it should work.
$handle = fopen("path/to/the/html/file/containing/the/urls.html", "r");
$storage = "path/where/you/want/your/images/";
$lockFile = __DIR__.'/index.lock';
$index = 0;
// get the lock index
if ( !file_exists( $lockFile ) )
{
file_put_contents( $lockFile, 0 );
}
// load the current index
$start = file_get_contents( $lockFile );
if ( $handle )
{
// line by line step by step
while ( ( $line = fgets( $handle ) ) !== false )
{
// update the
$index++;
if ( $start > $index )
{
continue;
}
// match the url from the element
preg_match( '/<a href="(.+)">/', $line, $url ); $url = $url[1];
$file = basename( $url );
// check if the file already exists
if ( !file_exists( $storage.$file )) //edited
{
file_put_contents( $storage.$file, file_get_contents( $url ) );
}
// update the lock file
file_put_contents( $lockFile, $index );
}
fclose($handle);
}
else
{
throw new Exception( 'Could not open file.' );
}
вы можете сделать что-то вроде этого, конечно, вы также должны добавить здесь некоторые ошибки проверки вещей :)
define("SITE_DIR", '/home/www/temp');
$file = file('in.txt');
foreach ($file AS $row){
preg_match('/(?<=\")(.*?)(?=\")/', $row, $url);
$path = parse_url($url[0], PHP_URL_PATH);
$dirname = pathinfo($path, PATHINFO_DIRNAME);
if (!is_dir(SITE_DIR . $dirname)){
mkdir(SITE_DIR . $dirname, 0777, true);
}
file_put_contents(SITE_DIR. $path, file_get_contents($url[0]));
}