Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Search found 38 matches
Author Message
  Topic: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
Александр Эсаулов

Replies: 424
Views: 520651

PostForum: Конструктор   Posted: Sun Nov 20, 2011 11:31 pm   Subject: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
Никто не разобрался с проблемой переполнения буфера? А именно когда приходит обрезанный json в ответ. В логе появляется запись:
Nov 20 00:32:55 isi realplexor/dklab_realplexor.conf: Caught a SIGTERM at Realplexor/Tools.pm line 54
Nov 20 00:32:55 isi realplexor/dklab_realplexor.conf: #011(in cleanup) Can't call method "debug" on an undefined value at Realplexor/Event/Connection.pm line 82 during global destruction.
Nov 20 00:32:55 isi realplexor/dklab_realplexor.conf: Use of uninitialized value $fh in delete at Storage/PairsByFhs.pm line 26 during global destruction.
Nov 20 00:32:55 isi realplexor/dklab_realplexor.conf: Use of uninitialized value $fh in delete at Storage/ConnectedFhs.pm line 27 during global destruction.
Nov 20 00:32:55 isi realplexor/dklab_realplexor.conf: Use of uninitialized value $fh in delete at Storage/ConnectedFhs.pm line 27 during global destruction.
Nov 20 00:32:55 isi r ...
  Topic: Множественные привязки
Александр Эсаулов

Replies: 3
Views: 6630

PostForum: Общие вопросы :: SQL   Posted: Wed Aug 24, 2011 8:55 pm   Subject: Множественные привязки
Прошу помочь мне с проектированием БД. Имеется таблица с товарами, каждый товар имеет свойства "тема", "вид продукции", "жанр" которые множественные. Я поступил так: создал дополнительную таблицу где храню связи product_id, property_id(привязка к свойству), value. Сами варианты значений свойств хранятся еще в одной таблице, привязываются по value. Вроде все верно и все работает, но что то мне подсказывает при большом кол-ве товаров будет сильная нагрузка на mysql. Товаров будет много, сотни тысяч, со временем может до миллиона дойдет. К тому же нужна будет одновременная фильтрация по нескольким свойствам, что в моем способе порождает отдельные INNER JOIN, да и свойств будет не 3 как я написал, а 6-8.

Заранее спасибо всем, кто поможет разобраться в этом вопросе.
  Topic: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
Александр Эсаулов

Replies: 424
Views: 520651

PostForum: Конструктор   Posted: Wed Apr 27, 2011 6:24 pm   Subject: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
похоже что да
  Topic: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
Александр Эсаулов

Replies: 424
Views: 520651

PostForum: Конструктор   Posted: Sat Apr 23, 2011 8:24 pm   Subject: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
никто не подскажет?
  Topic: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
Александр Эсаулов

Replies: 424
Views: 520651

PostForum: Конструктор   Posted: Tue Apr 19, 2011 10:49 am   Subject: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
Протестировал демо пример http://rutvit.ru/realplexor/demo, такая же проблема, длинные сообщения мгновенно вызывают ошибку сервиса. После этого не работает ни в одном браузере, кто нибудь наблюдал такое?


Вот пример ответа http://realtime.rutvit.ru/?identifier=1303198985.22850065100000:demo_who_is_online,1:demo_Alpha,1303199016.27747071000000:demo_Beta,1303199033.88212073700000:demo_RuTvit&ncrnd=1303199045206

[
{
"ids": { "demo_Beta": "1303199039.40592075200000" },
"data": "\u041f\u0440\u0435\u0434\u0435\u043b ..... тут много такого же кода.... \u043f\u0440\u0435\u0434\u0435\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e \u043d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043d\u0430\u0441 \u043a \u0438\u0441\u0442\u0438\u043d\u0435. \u041a\u0440\u0438\u0442\u0435\u0440\u0438\
  Topic: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
Александр Эсаулов

Replies: 424
Views: 520651

PostForum: Конструктор   Posted: Mon Apr 18, 2011 7:42 pm   Subject: Dklab_Realplexor: Comet-сервер промышленного масштаба с API для PHP и JavaScript
При больших объемах пересылаемых данных происходит переполнение буфера, и ответ приходит не полный, что вызывает ошибку javascript
Пример:

[
{
"ids": { "test": "33658314" },
"data": "тут данные и тут обрыв..


Причем, на локальной машине удалось воспроизвести ситуацию только после долгих отправок очень длинных текстов, а на сервере достаточно штук 10 несколькострочных сообщений и все, затык. Потом только ребут сервиса помогает. От чего зависит не понял, может кто подскажет?

В логе такое

Apr 18 20:00:22 isi realplexor/dklab_realplexor.conf: Caught a SIGTERM at Realplexor/Tools.pm line 54
Apr 18 20:00:23 isi realplexor/dklab_realplexor.conf: Normally terminated.
Apr 18 20:01:01 isi rotated[15045]: Rotation finished. 0 log files was processed. 0 seconds left
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Wed Jun 30, 2010 2:21 pm   Subject: Создание превьюшек изображений на лету с hash ключом.
Исправил заголовок темы — нет в русском языке такого слова как «ключем».
Лично мне — глаза режет.
Спасибо, случайно наверное ошибся при создании темы. Хотя в самих постах писал правильно.
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Wed Jun 30, 2010 10:37 am   Subject: Создание превьюшек изображений на лету с hash ключом.
Да, страница рвется. Хорошо, спасибо всем! Я еще подумаю как ужать урл к минимуму, как придумаю скажу.
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Tue Jun 29, 2010 6:16 pm   Subject: Создание превьюшек изображений на лету с hash ключом.
внимательней изучите .htaccess в первом посте
и что? если бы это была просто ссылка на статическую картинку с размером в имени результат был бы идентичный. а разницы между проверкой хешей или массив допустимых размеров я не вижу никакой, и то и другое делается скриптом для выяснения того можно или нет генерить такую картинку. только начилие хешей делает страшным URL не давая никаких заметных преимуществ.

но если религия не позволяет проверять размеры по массиву, то ничто не мешает добавить тот же хеш в имя статической картинки и разбирать скриптом именно его.
Да, тут я согласен с Вами. Религия действительно не позволяет содержать дополнительный массив с размерами, видимо без хеша не обойтись.
То что урлы получаются некрасивыми то да, только вот работать с этими урлами не человеку придется. Я еще в первом посте спросил, будут ли проблемы с такими урлами или нет, но никто ответа не дал. Кто нибудь может дать ответ, почему не стоит применять такие урлы? Некрасиво, но работает.
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Tue Jun 29, 2010 3:41 pm   Subject: Создание превьюшек изображений на лету с hash ключом.
Кроме того, наличие хеша в ссылке на привьюху подразуммевает обязательный запуск скрипта для его проверки. А это удар по производительности.
Не будет удара по производительности, внимательней изучите .htaccess в первом посте. РНР скрипт будет запускаться один только первый раз, в остальные разы mod_rewrite перенаправит на реальный кэш и РНР скрипт не будет запускаться. Смотрите именно первый пост, схему реализованного урла.
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Tue Jun 29, 2010 1:49 pm   Subject: Создание превьюшек изображений на лету с hash ключом.
Вместо $SECRET = '...'; сделайте $allowedSizes = array('200x150',);
Потом проверка, что указанные в запросе ширина и высота в списке разрешённых.
Каким образом? Вывожу к примеру я в шаблоне сайта картинку /images/img.jpg?w=200&h=150, и каким же образом я буду знать в /image.php который будет пережимать, что 200х150 это правильный допустимый размер? Предлагаете хранить все варианты сжимаемых размеров? Ну будет array('200x150','300x500','50х40') и Вы считаете, что так будет проще? Почему Вы отвергаете метод с цифровым подписыванием урла? Укажите хоть один недостаток моего и преимущества своего метода.
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Tue Jun 29, 2010 12:56 pm   Subject: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов
но их можно будет поменять значение через урл
Не понял этой фразы.
Почему указать массив небезопасно? Вредители смогут сгенерировать только картинки допустимых размеров (которые, в основном, и так будут в кэше от предыдущих запросов).
Вот пример урла /images/img.jpg?w=200&h=150. Что здесь злоумышленнику ничего не мешает подставить свои значения, к примеру /images/img.jpg?w=250&h=100 и т.д. И при этом на сервере сгенерится кэш. А вот если будет что то вроде этого /images/img.jpg?w=200&h=150&hash=b385592f7e9b28fe1a496dbe8c2b1e3c, то уже подмена параметров исключена, т.к:

$SECRET='secret word';
$params=$_GET;
unset($params['hash']);
$calc_hash=md5($SECRET.serialize($params));

if($_GET['hash']==$calc_hash)
{
// то генерим картинку, выводим ее и сохраняем кэш
}

Соответственно как генерим урл к картинке тоже вычисляем hash. Здесь подмена параметров исключена! И не надо на сервере ...
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Tue Jun 29, 2010 10:54 am   Subject: Создание превьюшек изображений на лету с hash ключом.
но тут действительно можно поменять вручную параметры и сгенерить на сервере ненужную картинку и сохранить ее кэш там
Храните массив разрешённых размеров. Каким образом? Ну разрешу я параметры w,h,max_w,max_h, но их можно будет поменять значение через урл. Тут только с ключом безопасно можно делать. Это очень похоже на http://dklab.ru/lib/HTTP_UrlSigner/ Дмитрия Котерова, когда урл подписывается цифрой подписью.
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Mon Jun 28, 2010 9:44 pm   Subject: Создание превьюшек изображений на лету с hash ключом.
п.с. генерить превьюхи "на лету" имеет смысл если картинки массово добавляются администрацией. если же они добавляются пользоваьтелем, то скорее всего им же и будут запрошены, так что проще их генерить сразу при загрузке пользователем оригинала на сервер.

Я категорически против создания превьюшек при загрузке картинок на сервер. Никогда нельзя точно знать, какие именно размеры могут потребоваться на выводе. Иногда требуется изменить дизайн сайта или что то переделать на выводе, и как быть в таком случае если картинок с подходящими размерами нет! Или нужно поменять наложение на фото, то тогда совсем засада. А по моему способу это можно делать с легкостью и без проблем. Раньше я пользовался конструкцией /images/img.jpg?w=200, та же схема, сначала РНР скрипт, потом статика, но тут действительно можно поменять вручную параметры и сгенерить на сервере ненужную картинку и сохранить ее кэш там. Этот метод я раньше использовал, а решил модернизировать и применить hash проверку введенных пар ...
  Topic: Создание превьюшек изображений на лету с hash ключом.
Александр Эсаулов

Replies: 18
Views: 12319

PostForum: Разное :: PHP   Posted: Mon Jun 28, 2010 5:01 pm   Subject: Создание превьюшек изображений на лету с hash ключом.
Возникла идея формировать превьшки на лету. Не знаю, как лучше делать, но пока придумал вот что.
Есть функция img() которая формирует урл к картинке, к примеру:
<img src="<?=img('/upload/dir/image.jpg','max_w=150&max_w=150')?>" />
В итоге формируется примерно такой урл:

/i/image.jpg?f=#закодированный_текст_с_параметрами#&cache=/admin/cache/images/36/fc/17/be/9910ee838b80
42239582d14d/b0980ec84d9babc8b73b008530760d87.jpg&hash=b385592f7e9b28fe1a496dbe8c2b1e3c

далее делаю в корне сайта такой .htaccess

RewriteEngine on
RewriteCond %{QUERY_STRING} ^.*cache=(.*)&hash.*$
RewriteCond %{DOCUMENT_ROOT}%1 -f
RewriteCond %{DOCUMENT_ROOT}%1 -s
RewriteRule ^i/(.+)$ %1 [L]

RewriteCond %{REQUEST_URI} /i/.*?.*
RewriteRule ^i/(.+)$ /image.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^&# ...
  Topic: PHP и огромное кол-во файлов
Александр Эсаулов

Replies: 8
Views: 6280

PostForum: Разное :: PHP   Posted: Mon May 24, 2010 4:59 pm   Subject: PHP и огромное кол-во файлов
Ivan1986
1) да делал подобное, помогает конечно же, но не всегда можно использовать.
2) md5 работает быстрее crc32, да и суть проблемы не в генерации ключа
3) Почему Вы думаете, что Cache_Lite тут поможет? Он так же создает множество файлов в папке, которое в последствии и приведет к подобной проблеме.
4) Memcache не дадут установить на виртуальном хостинге.
5) почему хранить не php скриптом?

И почему мысль запихать все в один файл очень плохая, напротив, если бы это и удалось сделать, скорость обращения к такому файлу была бы очень велика. Если здесь и есть трудный момент, так это только с хранением смещения и длины кэша.
  Topic: PHP и огромное кол-во файлов
Александр Эсаулов

Replies: 8
Views: 6280

PostForum: Разное :: PHP   Posted: Mon May 24, 2010 3:04 pm   Subject: PHP и огромное кол-во файлов
И еще сопутствующий вопрос. В собственном движке есть система кэширования. Кэш имеет название md5 c расширением php и хранится в файле некоторой папки, тоже с ограниченным числом файлов. Как бы все работает, но опять же, когда становится файлов кэша много, появляются тормоза.

У меня тут возникла мысль, а что если, все кэши запихивать в один файл и читать его потом в нужном месте. Конечно, нужно где то, хранить смещение от начала файла и длину кэша, что очень усложняет. И еще более усложняет, это очистка какого нибудь кэша где то в середине кэша. Нужно будет пересчитать все смещения для остальных кэшев, которые находятся правее очищаемого кэша. Кто нибудь подобное делал? Или не стоит заморачиваться с этой идеей?
  Topic: PHP и огромное кол-во файлов
Александр Эсаулов

Replies: 8
Views: 6280

PostForum: Разное :: PHP   Posted: Mon May 24, 2010 2:51 pm   Subject: PHP и огромное кол-во файлов
Да, вот именно проблема в file_exists(). Или, is_file(), аналогичная ситуация. Проверял так:

if(file_exists($path_to_file)) // тормоза жуткие
{
// вывод картинки
}

меняю на

if(1==1 || file_exists($path_to_file)) // тормоза исчезают
{
// вывод картинки
}

Как можно бороться с такой проблемой?
  Topic: PHP и огромное кол-во файлов
Александр Эсаулов

Replies: 8
Views: 6280

PostForum: Разное :: PHP   Posted: Mon May 24, 2010 1:06 pm   Subject: PHP и огромное кол-во файлов
Имеется проект, в котором ежедневно добавляются записи в БД и файлы (картинки). Посещаемость 100-3000 человек в день. Пока он работает на виртуальном хостинге, и конечно же, наблюдаются проблемы со скоростью генерации страниц.

Мои замеры показали, что главный тормоз в системе не запросы к БД, а простая проверка существования файла

if(file_exists($path_to_pic))
{
// вывожу картинку
}

Это все происходит в цикле, к примеру на странице может выводиться 20 таких картинок. Все картинки равномерно распределены в папках

/upload/files/dir1
/upload/files/dir1
.....
/upload/files/dirN

по 500 штук. Их не так уж и много, чуть более 8000. И при всем этом, наблюдаются ужасные тормоза. Бывает по несколько секунд именно на эти операции существования файлов тратится времени. Конечно, это зависит от хостера, но, может и моя есть ошибка сформированной структуры?
  Topic: PHP_MergePostFiles: Добавляет значения из массива $_FILES в $_POST и $_REQUEST,загружает файлы с URL
Александр Эсаулов

Replies: 9
Views: 20154

PostForum: Склад готовых решений :: PHP   Posted: Fri Apr 16, 2010 3:44 pm   Subject: PHP_MergePostFiles: Добавляет значения из массива $_FILES в $_POST и $_REQUEST,загружает файлы с URL
А никто не задумывался об безопасности помещения данных из массива $_FILES в $_POST и $_REQUEST? Я считаю, что это серьёзная дыра!

Ведь, в коде мы будем использовать, к примеру, массив $_POST, в который по сути можно передать любую информацию, с помощью cURL или просто браузером Opera,
изменив HTML код <input type="file" name="img" /> на

<input type="hidden" name="img[name]" value="conf.php" />
<input type="hidden" name="img[tmp_name]" value="/path/to/conf.php" />
<input type="hidden" name="img[error]" value="0" />
<input type="hidden" name="img[mime]" value="..." />
<input type="hidden" name="img[size]" value="..." />

В таком случае, можно легко обмануть код, и заставить с помощью функции rename() (если именно она использовалас ...
  Topic: Как узнать время модификации структуры таблицы?
Александр Эсаулов

Replies: 7
Views: 9346

PostForum: Общие вопросы :: SQL   Posted: Tue Dec 08, 2009 12:22 pm   Subject: Как узнать время модификации структуры таблицы?
Юрий Насретдинов
При запросе show table status поле Update_time изменяется в случае вставки/изменения строк в таблице. И при изменении структуры таблицы тоже изменяется. Поэтому этот вариант не подходит.
bæv
Этот вариант не подходит в случае виртуального хостинга. Там не дадут обратиться к файлам бд. Нужно более универсальное решение, если оно есть.
  Topic: Как узнать время модификации структуры таблицы?
Александр Эсаулов

Replies: 7
Views: 9346

PostForum: Общие вопросы :: SQL   Posted: Fri Dec 04, 2009 4:29 pm   Subject: Как узнать время модификации структуры таблицы?
Именно структуры.
  Topic: Как узнать время модификации структуры таблицы?
Александр Эсаулов

Replies: 7
Views: 9346

PostForum: Общие вопросы :: SQL   Posted: Tue Dec 01, 2009 3:36 pm   Subject: Как узнать время модификации структуры таблицы?
Возможно ли как то определить время последнего изменения структуры таблицы (поля, индексы)?

show table status: поле Update_time не подходит, т.к. это поле изменяется при добавлении новых строк в таблицу.
  Topic: Можно ли в готовый класс добавить метод?
Александр Эсаулов

Replies: 8
Views: 10562

PostForum: Разное :: PHP   Posted: Tue Oct 20, 2009 4:35 pm   Subject: Можно ли в готовый класс добавить метод?
Да что вы, я не собираюсь добавлять методы в классы. Была мысля, но сам понял это неправильный подход.
  Topic: Можно ли в готовый класс добавить метод?
Александр Эсаулов

Replies: 8
Views: 10562

PostForum: Разное :: PHP   Posted: Tue Oct 20, 2009 3:09 pm   Subject: Можно ли в готовый класс добавить метод?
Миша Спларов
А если планируется статический вызов методов? __call ведь не сработает.
  Topic: Можно ли в готовый класс добавить метод?
Александр Эсаулов

Replies: 8
Views: 10562

PostForum: Разное :: PHP   Posted: Tue Oct 20, 2009 2:38 pm   Subject: Можно ли в готовый класс добавить метод?
WingedFox
там нет примера для PHP
  Topic: Можно ли в готовый класс добавить метод?
Александр Эсаулов

Replies: 8
Views: 10562

PostForum: Разное :: PHP   Posted: Tue Oct 20, 2009 1:54 pm   Subject: Можно ли в готовый класс добавить метод?
Такой вопрос, класс уже объявлен, возможно ли добавлять к нему дополнительные методы?
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Mon Oct 19, 2009 5:09 pm   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Извиняюсь, предыдущий пост мой.
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Mon Oct 19, 2009 4:15 pm   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
dimagolov
я считаю, что переделывать мне код не нужно. Если бы делал сейчас с нуля, всеравно так бы сделал.
Код прекрасно работает, вот только если бы удалось как то определять свойства или название класса наследника, удалось бы избавиться от некоторого кол-ва кода.

И так, еще раз привожу код:

<?
class A
{
public static function Fun()
{
// Как здесь получить значение свойства ClassName из класса "B" ?
// Или название класса "B" ?
}
}

class B extends A
{
public static $ClassName='This class B';
}

B::Fun();



Господа, давайте уже окончательно определимся, возможно ли это как то узнать для PHP<5.3.0? Если нет нормального способа, так и говорите. Дайте четкий ответ.
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Mon Oct 19, 2009 10:54 am   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Maus
1) есть одно решение, но опять же для PHP 5.3.0. Вот здесь описано http://ua2.php.net/oop5.late-static-bindings. Мне это не подходит, есть другие способы?
2) вот это я так и не понял, что это?
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Sat Oct 17, 2009 3:55 pm   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Maus
1) Вы конечно правы, но приведу пример.

<?
class A
{
function aa()
{
print $this->ClassName;
}
}

class B extends A
{
var $ClassName='This class B';
}

$obj=new B;
$obj->aa();

//B::aa(); // Как быть, если так вызывать метод?
?>

Что если мы через "::" вызваем метод, как получить свойства вызываемого класса?
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Fri Oct 16, 2009 5:43 pm   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Миша Спларов
Используется в любом случае PHP5. В занимательная задачке речь идет о методах. Там нет решения данной задачи. Будем тогда пока использовать debug_backtrace(), а что делать. Если есть готовое решение, прошу поделиться.
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Fri Oct 16, 2009 4:11 pm   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
WingedFox
В методе класса A я ничего не знаю о классе B. Классов которые наследуются от A будет много, и в методах класса A нужно знать имя класса с которого был вызван метод.
dimagolov
Даже незнаю, правильно или не правильно построена архитектура ООП. Но уже не изменить.
Есть один главный (назовем его так) класс, который производит различные операции с таблицами БД (основные добавление/удаление/выборка).
Есть классы, которые ссылаться на методы этого главного класса, передавая в параметре имя своего класса.
Вызванный метод главного класса определяет свойства (get_class_vars()) класса переданного в параметре и производит нужные действия. В свойствах описываются задействованые таблицы, их поля, типы полей, и.д. Вся логика работы зависит именно от описания свойств класса.

Это было создано для сокращения кол-ва кода, да и для более безошибочной работы. Делая изменения/дополнения в главном классе, изменения получают все классы.

Но, в этих классах приходится создавать вручную ...
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Fri Oct 16, 2009 3:09 pm   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
WingedFox
public bool ReflectionClass::isSubclassOf ( string $class )
Возвращает true/false. Врядли мне это поможет. Ладно, вроде нашел вариант, связвнный с функцией get_called_class(). Для совместимости есть такой код:
<?
if(!function_exists('get_called_class'))
{
function get_called_class($bt = false,$l = 1)
{
if (!$bt) $bt = debug_backtrace();

if (!isset($bt[$l])) throw new Exception("Cannot find called class -> stack level too deep.");
if (!isset($bt[$l]['type'])) {
throw new Exception ('type not set');
}
else switch ($bt[$l]['type']) {
case '::':
$lines = file($bt[$l]['file']);
$i = 0;
$callerLine = '';
do {
$i++;
$callerLine = $lines[$bt[$l]['line']-$i] . $callerLi ...
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Fri Oct 16, 2009 2:45 pm   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
WingedFox
Я написал код. Но ничего не получилось. Я думаю что reflection тут не поможет.

<?
class A
{
function Fun()
{
print __CLASS__.'<br />'; // Выдает A
print get_class().'<br />'; // Выдает A

$ref=new ReflectionClass(get_class());

print "<pre>\n\n";

print "getMethods:\n";
print_r($ref->getMethods());

print "\n\ngetMethod:\n";
print_r($ref->getMethod('Fun'));

print "\n\ngetParentClass:\n";
print_r($ref->getParentClass()); // $ref->getParentClass() Ничего не возвращает

print '</pre>';

// Так и не получилось узнать, что метод вызывался именно через класс B
}
}

class B extends A
{

}

B::Fun();
?>

То что выдало в браузер:

A
A

getMethods:
Array
(
&# ...
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Fri Oct 16, 2009 1:29 pm   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
WingedFox
Да в том то и дело, как перебрать? Примерчик.
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Fri Oct 16, 2009 11:28 am   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
get_called_class() не на всех хостингах есть, поэтому не подойдет. В ReflectionClass я не нашел ни одного метода который мне возвратил нужное. Есть еще варианты?
  Topic: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Александр Эсаулов

Replies: 28
Views: 33401

PostForum: Разное :: PHP   Posted: Fri Oct 16, 2009 10:01 am   Subject: Наследование классов. Как узнать первоначальный класс с которого вызывался метод?
Вопрос такой, в коде все написал.

class A
{
function Fun()
{
print __CLASS__.'<br />'; // Выдает A
print get_class().'<br />'; // Выдает A

// Как здесь узнать, что вызывался имеено класс B ?
}
}

class B extends A
{

}

B::Fun();
 
Page 1 of 1 All times are GMT + 3 Hours
XML