X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> "многопоточность" средствами AJAX
1nSane
1nSane
Topic Starter сообщение 9.5.2010, 13:40; Ответить: 1nSane
Сообщение #1


Сразу скажу, в JS полный 0. Тыкаюсь основываясь на PHP и мануалах и примерах, выданных гуглом, так что код избыточный, скорее всего... приведу я код в пример, может что посоветуете, ибо у меня НЕ работает :( :
index.php
<span style="border:none; cursor:pointer; font-weight:bold" onclick="doLoad('indexHTML0','indexdiv0','table.php'); doLoadA('indexHTML','indexdiv','1','<?php echo $urls; ?>','test.php?url=');">NEW</span>
functions.js
function doLoad(html,div,url){
if (window.XMLHttpRequest){
request = new XMLHttpRequest();
request.onreadystatechange=function() {processRequestChange(html,div);};
request.open("GET",url,true);
request.send(null);
} else if (window.ActiveXObject){
request=new ActiveXObject("Microsoft.XMLHTTP");
if (request){
request.onreadystatechange=function() {processRequestChange(html,div);};
request.open("GET",url,true);
request.send();
}
}
}
function processRequestChange(html,div) {
if (request.status == 200) {
document.getElementById(div).style.display='block';
document.getElementById(html).innerHTML=request.responseText;
}
}
startA=1;
function doLoadA(htmlA,divA,startA,endA,urlA){
for(i=1;i<=endA;i++)
{
if (window.XMLHttpRequest){
request[i] = new XMLHttpRequest();
request[i].onreadystatechange=function() {processRequestChangeA(htmlA,divA,startA,endA,urlA,i);};
request[i].open("GET",urlA+i,true);
request[i].send(null);
} else if (window.ActiveXObject){
request[i]=new ActiveXObject("Microsoft.XMLHTTP");
if (request[i]){
request[i].onreadystatechange=function() {processRequestChangeA(htmlA,divA,startA,endA,urlA,i);};
request[i].open("GET",urlA+i,true);
request[i].send();
}
}
}
}

function processRequestChangeA(htmlA,divA,startA,endA,urlA,i) {
if (request[i].readyState == 4 && request[i].status == 200) {
divB = divA+startA;
htmlB = htmlA+startA;
document.getElementById(divB).style.display='block';
document.getElementById(htmlB).innerHTML=request[i].responseText;
}
}
table.php
[php]<?php
session_start();
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
include("config.php");

$url = mysql_num_rows(mysql_query("SELECT url_id FROM `urls`"));
for($i=1;$i<=$urls;$i++) echo "<div id=\"indexdiv".$i."\" style=\"display: block; \"><span id=\"indexHTML".$i."\">".$i."</span></div>"
?>[/php]Приводить test.php не буду, суть того, что он анализирует ссылку и выдает, ОК или нет...

Сейчас все работает через другую функцию:
start3=1;
function doLoad3(html3,div3,start3,end3,url3){
if (start3<=end3)
{
if (window.XMLHttpRequest){
request3 = new XMLHttpRequest();
request3.onreadystatechange=function() {processRequestChange3(html3,div3,start3,end3,url3);};
request3.open("GET",url3+start3,true);
request3.send(null);
} else if (window.ActiveXObject){
request3=new ActiveXObject("Microsoft.XMLHTTP");
if (request3){
request3.onreadystatechange=function() {processRequestChange3(html3,div3,start3,end3,url3);};
request3.open("GET",url3+start3,true);
request3.send();
}
}
}
}
function processRequestChange3(html3,div3,start3,end3,url3) {
if (request3.readyState == 4 && request3.status == 200) {
start4 = Number(start3)+1;
div4 = div3+start3;
html4 = html3+start3;
document.getElementById(div4).style.display='block';
document.getElementById(html4).innerHTML=request3.responseText;
doLoad3(html3,div3,start4,end3,url3);
}
}
Но ясно виден недостаток такого подхода. Выполняется все последовательно и из, допустим, 100 есть 5-10 медленных сайтов проверяемых, на них все заметно стопорится. Так как скрипт на выделенном сервере, то можно было бы себе позволить запустить в 40, скажем, "потоков" одновременно. И пусть бы себе заполняли подготовленные заранее DIV'ы...

Но вот после запуска ничего в ДИВах не меняется. Что я делаю не так?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
сообщение 10.5.2010, 22:26; Ответить: Letmetouchyou
Сообщение #2


много стращного кода )
разбирать не охота)
попробуй используя бибилиотеку jquery :)
будет меньше кода на нмогоЮ понятнее, и кросбраузерно)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
1nSane
1nSane
Topic Starter сообщение 10.5.2010, 22:40; Ответить: 1nSane
Сообщение #3


А более подробно? Мне как-то не важно что именно || запускать, свой код или jQuery. Главное КАК это сообразить?
Или в jQuery есть готовая спец. функция для многократного запуска без ожидания ответа?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
сообщение 11.5.2010, 1:15; Ответить: Letmetouchyou
Сообщение #4


In$ane, да какие существующие функции..
вот маленький пример.
rand.php:
[PHP]<?php
header('Content-Type: text/javascript; charset=windows-1251');
usleep(1000000);
echo "{'number':'".rand(10,1000)."'}";
?>[/PHP]
html & js :
<html>
<head>
<style>
body {font:13px normal 'Tahoma'}
div {background:#3399ff; margin:100px auto; width:500px; padding:3px}
span {padding:3px; display:block; color:#fff; border-right:5px solid #336699; width:25px; float:left; margin:3px; background:#3b5998}
input[type=button] {background:#ffcc33; border:none; color:#c68346}
input[type=text] {color:#fff; font-weight:bold; background:none; border:none}
</style>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
var num=0;
function answer(request){
num--;
$('input[type=text]').val(num);
$('div').append('<span>'+request.number+'</span>');
}
function assync(){
num++;
$('input[type=text]').val(num);
$.getJSON(
'rand.php',
answer
);
}
$(document).ready(function(){

for(var i=1; i<300; i++)
assync();

$('input[type=button]').click(assync);
});
</script>
</head>
<body>
<div>
<input type="button" value="request" />
количество запросов в очереди: <input type="text" value="#####" />

</div>
</body>
</html>
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
1nSane
1nSane
Topic Starter сообщение 18.5.2010, 2:02; Ответить: 1nSane
Сообщение #5


Letmetouchyou
НЕ живой пример :( количество запросов по нажатию реквеста растет, а более ничего не меняется...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
сообщение 18.5.2010, 8:49; Ответить: Letmetouchyou
Сообщение #6


In$ane, все работает, подождать нужно просто или
измени пхп файл
[PHP]<?php
header('Content-Type: text/javascript; charset=windows-1251');
usleep(100000);
echo "{'number':'".rand(10,1000)."'}";
?>[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
1nSane
1nSane
Topic Starter сообщение 18.5.2010, 15:03; Ответить: 1nSane
Сообщение #7


Да я вообще паузу убрал, а все равно ничего: http://1nsystem.ru/async.php
пробовал под Лисой, Оперой, Хромом...

Нашел тут похожий пример с комментариями: http://www.kachayev.ru/2008/10/10/jquery-a...skolko-potokov/ - попробовал приладить, вроде все хорошо, 45 потоков... по идее в каждом должен обращаться к 2-м УРЛ... НО... закомментил я пока эти строки, т.е. там сейчас пустышка, которая должна просто выдавать якобы инфу на экран... и что я заметил. Если на многие сайты у меня проверка шла 0.5-1 сек, и лишь на некоторые 5-10 сек, то в такой реализации у меня все стало МЕДЛЕННЕЕ, причем в разы, просто пустышку в 45 потоков он отображал минуту!

=============================

Проверил полноценно, курл в обработчике отрабатывает как и раньше, 0.5-1 сек, и лишь на некоторые 5-10 сек... а вот выдается на экран информация ОЧЕНЬ МЕДЛЕННО, выходит даже медленнее, чем то, как я раньше, по очереди запускал и выдавал...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
сообщение 18.5.2010, 16:25; Ответить: Letmetouchyou
Сообщение #8


In$ane, в приере все рабочее. разве что если ты использовал новую версию jquery то там нужн валидный json. а в примере он не валиден )
исправь :
[PHP]echo '{"number":"'.rand(10,1000).'"}';[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
1nSane
1nSane
Topic Starter сообщение 18.5.2010, 16:41; Ответить: 1nSane
Сообщение #9


Да, я использовал 1.4.2
Пример заработал, подредактировал его, чтобы видно было, что там многопоточность и ассинхрон:
[PHP]header('Content-Type: text/javascript; charset=windows-1251');
$date = date('H:i:s');
$time = rand(1,10);
sleep($time);
echo '{"number":"'.$date.'"}';[/PHP]
Попробовал пошаманить со строкой вывода - ничего не вышло, не показывает.
Отсюда вопрос, какого формата должен быть вывод? или где он формируется.

Для меня в идеале было бы формирование ТАБЛИЦЫ, а скрипт обработки формировал бы 1 законченную строку, и все бы динамически собиралось.

В JS я полный нуб и все эти конструкции мне чужды, JSON слышу впервые вообще...

А так, прогресс уже есть, конечно :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
сообщение 18.5.2010, 17:45; Ответить: Letmetouchyou
Сообщение #10


зачем таблицу?
если можешь дивами вставлять
?
[PHP]header('Content-Type: text/javascript; charset=windows-1251');
#парси тут нуэный тебе контетн
#
echo '{"number":"'.$result.'"}'; // и сюда резлуьтат
[/PHP]
в js принимаешь результаты
function(request){
$('куда вставлять').('<span>'+request.number+'</span>');
}

можешь с пхп скрипта передавть несколько параметров. Формат должен быть JSON
{"result":"ok", "source":"hhttp"}




и отправлять данные пхп скрипту:

$.getJSON(
    'rand.php',
    answer
    );

можешь с ГЕТ переменныи

var a = 2;
$.getJSON(
    'rand.php?cnt='+a, // eval('rand.php?cnt='+a),
    answer
    );


и по сути ето не многопоточность.
просто к серверу к одному обработчику сразу отправляеться очередь запросов)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Требуется помощь по сайту на "ВордПресс"
Закрылся доступ в панель администратора
12 Tia2 1522 25.3.2024, 6:54
автор: Skyworker
Открытая тема (нет новых ответов) ✅ sms.chekons.com - ⭐ Сервис для получения SMS на реальные номера USA "Non-VoIP, безлим SMS, API" ⭐
Сервис для получения SMS на реальные номера USA
10 Chekon 3578 24.3.2024, 14:15
автор: Chekon
Открытая тема (нет новых ответов) ⭐⭐⭐ Google Voice | Gmail - OLD аккаунты "SMS и звонки" ⭐⭐⭐
12 Chekon 3811 24.3.2024, 13:56
автор: Chekon
Опрос (нет новых голосов) Опрос: Результаты в упражнении "Жим лёжа" у вэбмастеров
35 Room 4464 13.3.2024, 13:10
автор: Room
Открытая тема (нет новых ответов) "Лежащий" домен - 10 лет. Продать?
8 Wolfhound 2379 5.3.2024, 3:22
автор: Liudmila


 



RSS Текстовая версия Сейчас: 28.3.2024, 20:13
Дизайн