Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты - загадка дня, ппц какой-то 
:(
    Опции темы
CyClon
Дата 11.9.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Простенький код:

Код
<?php

$scriptCount = 1;
$scriptPath = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
$base = file('base.txt');
$base = array_chunk($base, sizeof($base) / $scriptCount);

for ($copy = 0; $copy < $scriptCount; $copy++) {
    $file = fopen($copy, 'a');
    fputs($file, implode('', $base[$copy]));
    fclose($file);
    $purl = parse_url($scriptPath . '?base=' . $copy);
    if ($socket = fsockopen($purl['host'], 80, $errno, $errstr, 30)) {
        $headers = "GET " . $purl['path'] . " HTTP/1.0\r\n";
        $headers .= "Accept: * /*\r\n";
        $headers .= "Accept-Language: ru\r\n";
        $headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)\r\n";
        $headers .= "Host: " . $purl['host'] . "\r\n";
        $headers .= "Connection: Close\r\n\r\n";
        fputs($socket, $headers);
        fclose($socket);
    }
}

?>


НЕ РАБОТАЕТ: точнее работает, но в файл $file запись идет до тех пор пока я не удалю этот скрипт, то есть скрипт отработал вроде, но в фоне он как будто по бесконечному циклу пишет в файл одно и то же.

Код
<?php

$scriptCount = 1;
$scriptPath = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
$base = file('base.txt');
$base = array_chunk($base, sizeof($base) / $scriptCount);

for ($copy = 0; $copy < $scriptCount; $copy++) {
    $file = fopen($copy, 'a');
    fputs($file, implode('', $base[$copy]));
    fclose($file);
    $purl = parse_url($scriptPath . '?base=' . $copy);
    if ($socket = fsockopen($purl['host'], 80, $errno, $errstr, 30)) {
        $headers = "GET " . $purl['path'] . " HTTP/1.0\r\n";
        $headers .= "Accept: * /*\r\n";
        $headers .= "Accept-Language: ru\r\n";
        $headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)\r\n";
        $headers .= "Host: " . $purl['host'] . "\r\n";
        $headers .= "Connection: Close\r\n\r\n";
        //fputs($socket, $headers);
        fclose($socket);
    }
}

?>


А вот так работает, что самое странное. Точнее в файл запись идет только один раз, как и должно быть. Что получается? В одном скрипте нельзя чтоли использовать более 1 ресурса? Баг PHP? Или есть что-то, что я упустил?


--------------------
user posted image
PM   Вверх
teroni
Дата 11.9.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 15.5.2007
Где: Днепропетровск

Репутация: 1
Всего: 22



Честно говоря, не совсем понятно, что должен делать этот скрипт?
Зачем вот этот цикл вообще нужен, если тут только одна итерация?
Код

$scriptCount = 1;
...
for ($copy = 0; $copy < $scriptCount; $copy++)
{
...
}

Вот это зачем?
Код

$base = file('base.txt');
$base = array_chunk($base, sizeof($base) / $scriptCount);
...
fputs($file, implode('', $base[$copy]));

PM MAIL   Вверх
sTa1kEr
Дата 11.9.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: нет
Всего: 146



CyClon, так что вы хотите? У вас бесконечная рекурсия запросов идет. Скрипт делает запрос к самому себе же. Вам повезло, что у вас $scriptCount = 1, а то бы количество запросов к серверу в геометрической прогрессии бы увеличивалось, пока весь сервер не лег бы. А если бы $scriptCount было хотя бы 10 было... smile 
PM MAIL   Вверх
CyClon
Дата 11.9.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Извините, немного тупанул smile) Просто скрипт упростил и нечайно рекурсия получилась smile На самом деле там обращение было в первоначальном виде вот так:

Код
<?php

set_time_limit(0);
ignore_user_abort(1);

function writeFile($data, $file, $type = 'a')
{
    $fp = fopen($file, $type);
    flock($fp, 2);
    fwrite($fp, $data);
    flock($fp, 3);
    fclose($fp);
}

if (!defined('PHP_EOL')) {
    define('PHP_EOL', "\n");
}

$scriptPath = dirname(__FILE__) . '/lm.php';
$scriptCount = 1;

$base = file('base.txt');
$base = array_chunk($base, sizeof($base) / $scriptCount);

echo '<pre>' . PHP_EOL;

for ($copy = 0; $copy < $scriptCount; $copy++) {
    $rand = rand(100000, 999999);
    writeFile(implode('', $base[$copy]), $rand, 'w');
    $script = popen('php -f ' . $scriptPath . ' ' . $rand . ' &', 'r');
    pclose($script);
    echo time() . ' > Started ' . $copy . ' copy! Rand: ' . $rand . PHP_EOL;
}

echo '</pre>';

?>


Суть - в папке лежит скрипт lm.php и база данных base.txt. Нужно разделить базу на $scriptCount (должно быть как минимум больше 3, 1 - это для теста было) и запустить определенное кол-во скриптов.

Данные скрипт создавал ооочень много файлов, хотя как видите рекурсией не пахнет... Пол дня провозился, как только не пробовал - не получилось. То просто уже от безысходности начал пробовать через сокеты на свой же сервер обращаться, но и они не катят smile


--------------------
user posted image
PM   Вверх
dracs
Дата 11.9.2007, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


php



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.8.2007
Где: СПб

Репутация: нет
Всего: нет



Была похожая задача, решил так (у меня база лежала в табличке временной tmp_1)


Код

if ($_POST["start"]){
echo '
// k -число запускаемых параллельных скриптов,
// передается из формы
<script language="javascript">
                 for (i=1; i<k; i++){
                 // открываем новое окошко - ребенок принимает 
                 // какую именно часть таблицы сканерит и сколько частей всего
        window.open("children.php?page="+i+"&allpart="+k, "WorkWindow_"+i);
                }
    </script>
</head>
<body>
<div align="center">

</div>
</body>
</html>';
    exit;
}

ниже код страницы с формой



Как поломать тебе твой base.txt тебе решать - лично мне чаще хранить в БД
удобнее - чтото не проверилось - откатил, перепроверил и так далее.
Т.е. от числа записей играю.

Вместо сокетов бы использовал курл - удобнее при необходимости чекать или
через прокси или через сокс5. Опять таки - по времени одно и тоже.


PM WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1079 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.