сохранить результат работы

zxxx

Постоялец
Регистрация
9 Окт 2009
Сообщения
148
Реакции
4
есть скрипт для многопоточной скачки страниц

PHP:
 for ($i = 1; $i < 10; $i++) {
    $urls[$i] = "http://ru.wikipedia.org/wiki/$i";
} 

$cmh = curl_multi_init();
 

$tasks = array();

foreach ($urls as $url) {


	$ch = curl_init('http://'.$url);

	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	curl_setopt($ch, CURLOPT_HEADER, 0);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

	curl_setopt($ch, CURLOPT_TIMEOUT, 10);

	$tasks[$url] = $ch;

	curl_multi_add_handle($cmh, $ch);
}
 

$active = null;

do {
	$mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);


while ($active && ($mrc == CURLM_OK)) {

	if (curl_multi_select($cmh) != -1) {

		do {
			$mrc = curl_multi_exec($cmh, $active);

			$info = curl_multi_info_read($cmh);

			if ($info['msg'] == CURLMSG_DONE) {
				$ch = $info['handle'];

				$url = array_search($ch, $tasks);


				$tasks[$url] = curl_multi_getcontent($ch);


				curl_multi_remove_handle($cmh, $ch);

				curl_close($ch);

			}
		}
		while ($mrc == CURLM_CALL_MULTI_PERFORM);
	}
}

curl_multi_close($cmh);

нужно сохранить результат работы в текстовый файл
каждый результат содержится в $tasks[$url]
пробовал после него функцию записи в файл, но возникла проблема с именем файла
 
....пробовал после него функцию записи в файл, но возникла проблема с именем файла...
А может быть стоило привести код где проблема записи в файл а не то что работает?
 
  • Нравится
Реакции: zxxx
PHP:
for ($i = 1; $i < 10; $i++) {
    $urls[$i] = "http://ru.wikipedia.org/wiki/$i";
} 

$cmh = curl_multi_init();
 

$tasks = array();

foreach ($urls as $url) {


    $ch = curl_init('http://'.$url);

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

    $tasks[$url] = $ch;

    curl_multi_add_handle($cmh, $ch);
}
 

$active = null;

do {
    $mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);


while ($active && ($mrc == CURLM_OK)) {

    if (curl_multi_select($cmh) != -1) {

        do {
            $mrc = curl_multi_exec($cmh, $active);

            $info = curl_multi_info_read($cmh);

            if ($info['msg'] == CURLMSG_DONE) {
                $ch = $info['handle'];

                $url = array_search($ch, $tasks);


                $tasks[$url] = curl_multi_getcontent($ch);

$fp = fopen("app//$url.txt", "a");
fwrite($fp,"\r\n$tasks[$url]");
fclose($fp);

                curl_multi_remove_handle($cmh, $ch);

                curl_close($ch);

            }
        }
        while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

curl_multi_close($cmh);


пробовал так, все получается, но только в имени содержаться недопустимые символы / ? и т.п. Проповал их убирать preg_replace, но ничего не вышло

здесь пояснение к скрипту
 
Сейчас так:
PHP:
.....
for ($i = 1; $i < 10; $i++) { 
    $urls[$i] = "http:[B]//[/B]ru.wikipedia.org[B]/[/B]wiki[B]/[/B]$i"; 
}
.....
foreach ($urls as $url) {
  .....
  $fp = fopen("app//$url.txt", "a");  
  ...... 
}
.....
Совершенно верно замечено что fopen("app//$url.txt", "a"); приведет к абракадабре в имени файла, в частности слеши недопустимы. Просто используйте например директорию для сохранения по имени домена, а файлы по $i.html.
Или/и замените недопустимые символы
PHP:
...
$url=str_replace(array('/'),array('_'),$url); //тут можно список недопустимух символов продолжить при необходимости
...
$fp = fopen("app//$url.txt", "a");
 
  • Нравится
Реакции: zxxx
попробуй так
PHP:
$url=str_replace(array('/',':','.'),'_',$url);
а 2 слеша то зачем ХЗ
PHP:
$fp = fopen("app/".$url.".txt", "a");
да и закрытие открытие файлов я бы из цикла убрал оно вам надо?
 
PHP:
$url=preg_replace(array('/',':'),'_',$url);

с этим не получается, на выходе получается 2 файла пустых
 
вот так
PHP:
<?php
for ($i = 1; $i < 10; $i++) {
    $urls[$i] = "http://ru.wikipedia.org/wiki/$i";
} 

$cmh = curl_multi_init();
 

$tasks = array();

foreach ($urls as $url) {


    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

    $tasks[$url] = $ch;

    curl_multi_add_handle($cmh, $ch);
}
 

$active = null;

do {
    $mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);


while ($active && ($mrc == CURLM_OK)) {

    if (curl_multi_select($cmh) != -1) {

        do {
            $mrc = curl_multi_exec($cmh, $active);

            $info = curl_multi_info_read($cmh);

            if ($info['msg'] == CURLMSG_DONE) {
                $ch = $info['handle'];

                $url = array_search($ch, $tasks);


                $tasks[$url] = curl_multi_getcontent($ch);
$name=str_replace(array('/',':','.'),'_',$url);
$fp = fopen("app/".$name.".txt", "w");
fwrite($fp,$tasks[$url]."\n");
fclose($fp);

                curl_multi_remove_handle($cmh, $ch);

                curl_close($ch);

            }
        }
        while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

curl_multi_close($cmh);
 
  • Нравится
Реакции: zxxx
вот так
PHP:
<?php
for ($i = 1; $i < 10; $i++) {
    $urls[$i] = "http://ru.wikipedia.org/wiki/$i";
} 
$cmh = curl_multi_init();
$tasks = array();
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $tasks[$url] = $ch;
    curl_multi_add_handle($cmh, $ch);
}
$active = null;
do {
    $mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && ($mrc == CURLM_OK)) {
    if (curl_multi_select($cmh) != -1) {
        do {
            $mrc = curl_multi_exec($cmh, $active);
            $info = curl_multi_info_read($cmh);
            if ($info['msg'] == CURLMSG_DONE) {
                $ch = $info['handle'];
                $url = array_search($ch, $tasks);
                $tasks[$url] = curl_multi_getcontent($ch);
$name=str_replace(array('/',':','.'),'_',$url);
$fp = fopen("app/".$name.".txt", "w");
fwrite($fp,$tasks[$url]."\n");
fclose($fp);
                curl_multi_remove_handle($cmh, $ch);
                curl_close($ch);
            }
        }
        while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}
curl_multi_close($cmh);

незнаю как, но заработало :) Я тоже делал примерно так

PHP:
$url=str_replace(array('/',':','.'),'_',$url);
$fp = fopen("app//$url.txt", "a");
fwrite($fp,$tasks[$url]);
fclose($fp);

но у меня глюк выходил, огромное спасибо
 
незнаю как, но заработало :) Я тоже делал примерно так но у меня глюк выходил, огромное спасибо
вот смотрите
PHP:
$ch = curl_init('http://'.$url);
что вы курлу скармливаете в итоге
httр://httр://ru.wikipedia.org/wiki/1
ну и здесь если
делать так как у вас
PHP:
$url=str_replace(array('/',':','.'),'_',$url); 
$fp = fopen("app//$url.txt", "a"); 
fwrite($fp,$tasks[$url]); 
fclose($fp);
у вас просто пустые файлы как минимум будут вы же заменяете значение $url а потом пытаетесь по этому новому значению чтото достать из массива
 
  • Нравится
Реакции: zxxx
Назад
Сверху