
CoDy
User-
Posts
381 -
Joined
-
Last visited
-
Days Won
3
Content Type
Profiles
Forums
Calendar
Store
Everything posted by CoDy
-
Я просто раньше не над этим как-то вообще не задумывался. Наткнулся на это, когда пытался одновременно на сервер отправлять несколько асинхронных запросов из под JS на клиенте, причем скрипты-обработчики XHR запросов активно юзали сессионные данные. И оказалось, что ни браузер, ни сам стандартный механизм поддержки сессий в PHP в принципе не позволяют реализовать параллельное выполнение скриптов, которые стартуют сессию. Пока разбирался как это обойти это ограничение, открыл для себя такую особенность работы PHP после обрыва соединения. И на самом деле очень был удивлен таким поведением. Поскольку, допустим есть некий скрипт время работы которого может затянуться на долго и поэтому сознательно снимаем ограничение на время выполнения. И если по какой-то причине нужно прервать его работу, то простой оборыв соединение в браузере не даст нужного эффекта. Именно поэтому решил обратиться с таким вопросом. Просто хочу прояснить для себя эту ситуацию, чтобы иметь ввиду на будущее. Почему-то кажется, что это все как-то решается тонкой настройкой PHP.
-
Всем привет... На днях обнаружил интересную особенность работы PHP. Допустим есть некий скрипт, который может выполняться относительно долго. Если в браузере, после запуска скрипта прервать сединение(кнопка стоп в браузере), то скрипт не отпадает, а продолжает работать дальше в штатном режиме. Вот искусственное симулирование подобной ситуации: <?php header('Content-Type:text/html;charset=UTF-8', true); error_reporting(-1); $fileName = 'log_file.log'; if ( !empty($_GET['work_time']) ) { set_time_limit((int)$_GET['work_time']); $startTime = time(); $i = 1; while ( true ) { $fileHandler = fopen($fileName, 'a'); $workingTime = time() - $startTime; fwrite($fileHandler, "$i: working time $workingTime seceond\n"); fclose($fileHandler); ++$i; echo '_'; sleep(1); } } elseif ( !empty($_GET['get_log']) ) { set_time_limit(2); if ( file_exists($fileName) ) { while ( !is_writable($fileName) ) { usleep(500000); } $content = file($fileName); echo '<pre>', implode('', array_reverse($content)), '</pre>'; } else { echo 'файл отсутствует'; } } else { $path = parse_url($_SERVER['REQUEST_URI']); $path = $path['path']; ?> <p>Указать время в терении которого будет работать скрипт, даже если заррыть соединение.</p> <form action=""> <fieldset> <label for="work_time" title="">Время работы скрипта</label> <input type="text" name="work_time" id="work_time" value="10" /> <input type="submit" value="Отправить" /> </fieldset> </form> <a href="<?php echo $path;?>?get_log=1" title="s">Посмотреть лог</a> <?php } Запускаем скрипт, указываем в поле ввода время в течении которого будет работать скрипт, отправляем форму на сервер. Скрипт начинает в цикле запись в файл, пока не превысит время работы указанное в форме. После того как браузер начал ожидание ответа, открываем в новом окне ссылку ''Посмотреть лог". В открывшемся окне постоянно жмем обновить и видим содержимое файла в который идет запись. Если вернуться к первому окну, остановить ожидание ответа и вернуться к просмотру содержимого файла, то видим что скрипт не остановился, а продолжает работать. Вот не могу понять почему так происходит, хотя тут написано мануал, что скрипт должен оборваться.
-
Админы, убейте эту ветку, она была создана когда мозг был в отключке.
-
Сори, что не объяснил, в чем собственно вопрос, думал что из кода и результата будет понятно. Вопрос в следующем: почему во втором цикле не выводится строка 33, ведь $key = 3, а is_int(3) == true. После одного несрабанывания условия(на втором элементе массива is_int('e') = false), значение переменных $key и $val равняется null.
-
Кто то может объяснить эту фичю: $array = array ( '1' => 1, '2' => 2, '3' => 3 ); while ( (list ($key, $val) = each($array)) && (is_int($key)) ) { echo $key, $val, '<br />'; } echo '————————--''; $array = array ( '1' => 1, 'e' => 2, '3' => 3 ); while ( (list ($key, $val) = each($array)) && (is_int($key)) ) { echo $key, $val, '<br />'; } exit(); Результат: 11 22 33 ————————————————— 11
-
Можно так попробовать, но это при условии, что страници генерируются динамически и есть доступ к скриптам. Надеюсь из кода все будет понятно. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1251"> <title></title> <style type="text/css"> // стили для активного меню .menu_1 #menu_1, .menu_2 #menu_2, .menu_3 #menu_3, .menu_4 #menu_4{ font-weight:bold; } </style> </head> <!-- Имя класса соответствует, идентификатору активного меню --> <body class="menu_2"> <ul> <li id="menu_1">Меню</li> <li id="menu_2">Меню</li> <li id="menu_3">Меню</li> <li id="menu_4">Меню</li> </ul> </body> </html>
-
Всем привет... Помогите разобраться с парсингом xml-документа. При чтении xml-документа парсер воспринимает перенос строки как пустой элемент, можно ли как-то от этого избавиться???? Вот код: $xml = <<<XML <?xml version="1.0" encoding="utf-8"?> <root> <element>assdsda</element> </root> XML; $reader = new xmlReader(); $reader->xml($xml, 'utf-8', LIBXML_NOBLANKS); while ( $reader->read() ) { echo "{$reader->name}"; } Вот что получаю: root #text - перенос строки element #text element #text - перенос строки root В мануале пишут что опция LIBXML_NOBLANKS решает эту проблему, но как видите не помогает.
-
Если Вас интересует быстродействие, то полезным будет ресурс webo.in. Я там читал исследования по интересующему Вас вопросу, с цифрами, примерами, опытами.
-
Портал intuit.ru последнее время начал материал в виде видеолекций выкладывать. Я думаю там, можно найти видеолекции и по хтмл и цсс.
-
Еще нужно учесть кодировку базы данных. В phpMyAdmin это можно посотреть так: выбрать базу->закладка "Операции"->секция "Сравнение". Обычно базу хранят у utf-general-ci кодировке, и соответственно страници сайта отдают в тойже utf-8.
-
Можно так сделать <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> </head> <body> <form id="my_form" action="" method="get"> <ul> <li><a href="default_href" id="link_1">LINK 1</a></li> <li><a href="default_href" id="link_2">LINK 2</a></li> <li><a href="default_href" id="link_3">LINK 3</a></li> </ul> <input id="linkChanger_1" type="checkbox" value="link_1@new_hre_1" onChange="java script: changeLinkHref(this);"> <input id="linkChanger_2" type="checkbox" value="link_2@new_hre_2" onChange="java script: changeLinkHref(this);"> <input id="linkChanger_3" type="checkbox" value="link_3@new_hre_3" onChange="java script: changeLinkHref(this);"> </form> <script type="text/javascript"> function changeLinkHref(inputChanger) { var param = inputChanger.value.split('@'); var link = document.getElementById(param[0]); param[2] = link.href; link.href = param[1]; inputChanger.value = param[0] +'@'+ param[2]; return true; } </script> </body> </html>
-
Свойство text-align:justify влияет только на "полностью заполненные" строки элемента. Последняя, незаполненная строка будет иметь выравнивание по левому краю. Вот тут из этого примера, думаю все будет понятно: http://jsfiddle.net/KmdUP/
-
А не вариант поставить для формы link]<form style="display:inline;" ......... <form
-
Я на Joomla как то ставил плагин, который работает по такому принципу. Но только там данные не сеарилизовались, а использовался PHP Accelerator и данные кэшировались в опкоде. Прирост в быстродействии был ощутимый.
-
С удовольствием бы использовал стандартный механизм репликации, но настроить его для файловой учетной платформы и MySql сервером на хостинге не получится. Вот поэтому и извращаюсь.
-
Очень интересный материал, не сталкивался с подобными задачами ранее. Но нет, это не совсем то, мне не нужна история изменений. Мне нужна информация о самом факте изменения, с указанием следующих данных: - имя таблицы, в которой имело место изменение; - идентификатор записи, которая пдверглась изменению; - какие именно поля в записи были изменены. Для чго это нужно? Например есть локальная база с таблицей, в которой имеется 20 полей и порядка 50 000 записей. И есть удаленная база с которой нет возможности настроить стандартный механизм репликации. Я хочу чтобы они обменивались пакетами в XML-формате, уведомляя удаленную базу о произошедших изменениях.Это все будет гоняться по сети через POST http, например. Допустим имел факт изменения 100 записей, причем в каждой записи было изменено по 1 полю. При очередном сеансе синхронизации, я лезу в таблицу, которая фиксирует изменения, и формирую XML-пакет, который содержит данные, которые действительно изменились. Вот такой доморощенный механизм репликации баз получается. Что мне не нравится в коде,который указан в первом посте: он не универсальный. Там вся логика заложена в теле триггера. Если таблиц будет больше 10, и в какой-то момент нада будет поправить логику сбора данных о изменениях, это будет запара. Если бы можно было бы, распихать всю логику в пару-тройку процедур и дергать их в теле триггера. Но похоже в MySql довольно скудные возможности в плане программирования. В частности возникли такие проблемы: - определить имя таблицы, для которой вызван триггер; - не понятно что такое "ключевые слова" OLD и NEW, которые предоставляют доступ к вставляемым и обновляемым данным и можно ли из передать в процедуру. Да и литературы оч. мало по этой теме ((.
-
Просто нужно отслеживать изменение таблицы(с указанием полей, которые были изменены, если выполняется update) - все это делается исключительно в целях получения истории изменений - вот собственно и вся цель.
-
Всем привет. Есть следующая задача: - отследить изменение таблици(insert/update), причем нужно указать какие поля изменились; - в спец поле в таблице вставлять hash всей записи. Вот мое решение -- таблица для отслеживания изменений CREATE TABLE `change`( idChange INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `table` VARCHAR(50) NOT NULL, rowId INT(10) UNSIGNED NOT NULL, columnLst VARCHAR(255) NOT NULL, PRIMARY KEY (idChange) ); -- собственно объект наблюдений CREATE TABLE item( idItem INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, title VARCHAR(45) NOT NULL, count TINYINT(4) UNSIGNED NOT NULL, price DECIMAL(10, 2) NOT NULL, `hash` CHAR(32) DEFAULT NULL, PRIMARY KEY (idItem) ); -- набор тригеров для таблици item CREATE TRIGGER after_insert_item AFTER INSERT ON item FOR EACH ROW BEGIN INSERT INTO `Change` SET `table` = 'Item', `rowId` = new.idItem, `columnLst` = 'title,count,price'; END $ CREATE TRIGGER after_update_item AFTER UPDATE ON item FOR EACH ROW BEGIN DECLARE modColumnLst VARCHAR(255) DEFAULT ''; IF OLD.title <> NEW.title THEN SET modColumnLst = 'title,'; END IF; IF OLD.count <> NEW.count THEN SET modColumnLst = 'count,'; END IF; IF OLD.price <> NEW.price THEN SET modColumnLst = 'price'; END IF; IF modColumnLst <> '' THEN INSERT INTO `Change` SET `table` = 'Item', `rowId` = NEW.idItem, `columnLst` = modColumnLst; END IF; END $ CREATE TRIGGER before_insert_item BEFORE INSERT ON item FOR EACH ROW BEGIN SET NEW.hash = MD5(CONCAT(new.idItem, new.title, new.count, new.price)); END $ CREATE TRIGGER before_update_item BEFORE UPDATE ON item FOR EACH ROW BEGIN SET new.hash = MD5(CONCAT(new.idItem, new.title, new.count, new.price)); END $ DELIMITER ; Вот пример вставки INSERT INTO `Item` (`idItem`,`title`,`count`,`price`) VALUES (null,'fsdfsd',2,23.45), (null,'sdfsdf',1,26.45), (1,'12312312',2,23.45), (2,'—--',1,26.45) ON DUPLICATE KEY UPDATE title = VALUES(title), count = VALUES(count), price = VALUES(price); SELECT * FROM `Item`; SELECT * FROM `Change`; Есть ли возможность сделать все это более универсально, а не дублировать для каждой таблици? Например, можно ли как-то пройтись по NEW и OLD, как по массиву или передать его в процедуру? И можно ли узнать имя таблици для которой вызывается триггер?
-
Копайте в сторону AJAX. Это именно то что вам подойдет. Только есть одно но, это будет работать исключительно при включенной JS. Это Вам поможет: http://www.ruseller.com/lessons.php?rub=28&id=569
-
Smarty. Перестает работать после изменения шаблонов
CoDy replied to faustrash's question in HTML Coding
Если не ошибаюсь, если найти директорию, где хранятся скомпилированные версии шаблонов и почистить ее, то это заставит смарти перекомпилить ваш шаблон. Но предпочтительней конечно метод который описал Vlad. -
Мастреская CSS профессиональное применение WEB стандартов Автор: Энди Бадд Год издания: 2007 В этой книге в приложении А описывается похожий шаблон.
-
Вот так может. Корявенько конечно, но работает вроде. Ток это на php написано, на JS думаю не возникнет проблем перенести. <?php /** * Подбор правильного измерения для заданного числа. * * Применение того или иного измерения зависит от значения числа, * которое образуют: * - 2-е последние цифры, если это значение меньше 20, * - 1-а последняя цифра, если это значение больше 20. * * @param int $number Число, для которого подбирается измерение. * @param array $meterings Массив возможных измерений. * @return string */ function getMetering($number = 0, $meterings = array( 0 => '0', 1 => '1', 2 => '2' )) { // Получить, определяющее измерение, значение младших числообразующих разрядов. $lastDigits = $number % 100; $lastDigits = ( $lastDigits >= 20 )? $lastDigits % 10 : $lastDigits; // В зависимости от значения единичного разряда пишем правильное слово. if ( $lastDigits === 0 || $lastDigits >= 5 && $lastDigits <= 20 ) { $metering = 0; } elseif ( $lastDigits == 1 ) { $metering = 1; } else { $metering = 2; } return $number .' '. $meterings[$metering]; } // Измерения для дней. $dayMeterings = array( 0 => 'дней', // 0 дней. 1 => 'день', // 1 день. 2 => 'дня', // 2 дня. ); // Измерения для часов. $hourMeterings = array( 0 => 'часов', // 0 часов. 1 => 'час', // 1 час. 2 => 'часа', // 2 часа. ); for ( $i = 0; $i < 20; ++$i ) { $str = getMetering(rand(0, 1000), $dayMeterings) .' ' . getMetering(rand(0, 1000), $hourMeterings) .'<br />'; echo $str; } Вот что получается: 158 дней 945 часов 549 дней 100 часов 453 дня 444 часа 992 дня 172 часа 880 дней 206 часов 174 дня 931 час 30 дней 952 часа 442 дня 843 часа 1000 дней 898 часов 637 дней 878 часов 380 дней 764 часа 102 дня 504 часа 267 дней 768 часов 684 дня 692 часа 254 дня 630 часов 725 дней 909 часов 434 дня 569 часов 67 дней 123 часа 401 день 302 часа 57 дней 805 часов
-
Это не работает в некоторых версиях Explorer.