PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (6): [1] 2 3 4 5 6 »

> Найдено сообщений: 80
Faab Отправлено: 29 Апреля, 2022 - 07:56:51 • Тема: setcookie при кроссдоменном запросе на локалке • Форум: HTTP и PHP

Ответов: 1
Просмотров: 1718
Кейс: с локального адреса http://127[dot]0[dot]0[dot]1:4000 (фронт) делается запрос на другой локальный адрес http://local[dot]api[dot]tor (бэк). Домен http://local[dot]api[dot]tor высылает ответ, при этом ставит httponly куку через хидер:


CODE (htmlphp):
скопировать код в буфер обмена
  1. Set-Cookie: tor_local_75a4cf4d_refreshToken=189238C698; Httponly; Path=/; Max-Age=2592000;


Браузер (хром) заботливо показывает что при ответе запроса высылается кука и тут же делает примечание что кука была заблокирована. Причина то мне понятна - нет атрибута SameSite , поэтому установка куки расматриватеся как при режиме SameSite=Lex. А атрибут SameSite=None действителен только при атрибуте Secure и https-протоколе.

Что делать то? Есть варианты как-то обойти это на локалке?
Faab Отправлено: 19 Декабря, 2016 - 07:25:12 • Тема: Вывод изображения без file_put_contents() • Форум: Вопросы новичков

Ответов: 2
Просмотров: 232
Через апи я получаю данные изображения, которые если вставить в функцию file_put_contents(), то я получаю загруженное изображение.

PHP:
скопировать код в буфер обмена
  1.  
  2. // $data - данные изображения
  3. file_put_contents("temp/test123.jpg", $data);
  4.  


Можно ли как то динамически выводить изображения, без создания файла, напрямую генерировать ссылку изображения?
Faab Отправлено: 30 Апреля, 2015 - 16:55:38 • Тема: Как парсить большие XML-файлы • Форум: XML и его обработка

Ответов: 16
Просмотров: 7846
MiksIr пишет:
Думаю, сначала стоит заняться профайлингом, что бы понять - где теряется время.
Второе - такие вещи нужно запускать и консоли, а не через веб.
Ну и третье - сохранять состояние после каждой операции, что бы повторный запуск продолжал работу, а не начинал сначала.


На счёт третьего: так может и сделать ограничение на чтение только 50 товаров за один запуск скрипта? После чтения 50 продукта установить cron, что бы через две-три минуты запустить этот же скрипт.

Я пока не знаю как перейти к чтению именно мне нужного продукта, но думаю это можно реализовать.
Faab Отправлено: 30 Апреля, 2015 - 16:45:30 • Тема: Как парсить большие XML-файлы • Форум: XML и его обработка

Ответов: 16
Просмотров: 7846
Да, конечно я использую временные таблицы.

Большого файла нет: увеличил свой файл до 3,500 товаров методом копи-паст.

При оригинальном коде, у меня выдало ошибку "Fatal error: Maximum execution time of 30 seconds exceeded" уже когда в базу записался 150-ый товар. Время работы скрипта: 4 минуты.

Когда я подправил свою функцию _custom_function_save_current_param(), а именно убрал проверку, связную таблицу, так что бы напрямую записывался каждый объект параметра при вызове функции, то теперь у меня сгенерировалась ошибка "Fatal error: Maximum execution time of 30 seconds exceeded" только уже когда в таблице было записано 672 товара (это 20102 параметра).

Последний вариант у меня занял 7 минут, и то, учитывая что у меня в локальном php.ini прописано следующее:
CODE (htmlphp):
скопировать код в буфер обмена
  1. memory_limit = "-1"
  2. max_execution_time = 0     ; Maximum execution time of each script, in seconds
  3. max_input_time = 0      ; memory_limit = "-1"
  4. max_execution_time = 0     ; Maximum execution time of each script, in seconds
  5. max_input_time = 0      ; Maximum amount of time each script


На хостинге прописать такое как вы понимаете трудно.

Тут как не крути надо пробовать вариант преложенный Esterio и DeepVarvar.
Faab Отправлено: 30 Апреля, 2015 - 13:51:42 • Тема: Как парсить большие XML-файлы • Форум: XML и его обработка

Ответов: 16
Просмотров: 7846
esterio пишет:
http://php.net/xml
взято отсюда
http://stackoverflow[dot]com/questio[dot][dot][dot]large-xml-in-php
пример
http://php.net/manual/ru/example...ml-structure.php
ключевым кодом в примере есть
то есть читать по 4Кб файл.
Если у вас ссылка ...


Ну ты и разложил по полочкам. ) Буду вникать. Будет результат - отпишусь.

DeepVarvar пишет:
Faab пишет:
Вот я начну читать файл

Вот так:
PHP:
скопировать код в буфер обмена
  1. $file = fopen('...', 'rb');
  2. $data = '';
  3. while (!feof($file) && strpos(fread($file, 1024), '<offer') === false) {
  4.     $data .= 'что-то там';


Да, сейчас попробую сделать так, как вы советуете с Эстерио.

MiksIr пишет:
XMLReader не читает весь файл в память. Он оперирует курсором, указывающим на текущее положение в файле и операции сдвига курсора.

А со временем у него в другом месте проблема, тут хоть кусками, хоть не кусками.



Ты же видишь что я читаю offer классом XMLElementIterator - это уже не чистый XMLReader (это я сейчас тыкаю пальцем в небо). Иначе прочитать параметры продукта я не смог.

Так и в чём проблема у человека?
Faab Отправлено: 30 Апреля, 2015 - 12:39:42 • Тема: Как парсить большие XML-файлы • Форум: XML и его обработка

Ответов: 16
Просмотров: 7846
DeepVarvar пишет:
Да, читаешь файл кусками, ищешь там метку "<offer", по ней разбиваешь на маленькие файлы, потом натравливаешь свой импортер на эти файлы. После успешного импорта удаляешь эти временные файлы.


Вот не въехал я)))

Вот я начну читать файл:
PHP:
скопировать код в буфер обмена
  1.  
  2.   $o_reader = new XMLReader();
  3.   if (!$o_reader->open($s_url)){
  4.     //  not valid url
  5.   }
  6.  


Мне прочитать каждый кусок файла с offer и затем создать мини-файл, например, в папке tmp? Я пока не знаю как это реализовать в коде, но разве так парсер не захлебнётся?
Faab Отправлено: 30 Апреля, 2015 - 12:19:18 • Тема: Как парсить большие XML-файлы • Форум: XML и его обработка

Ответов: 16
Просмотров: 7846
Мне дали тестовый XML-файл для ознакомления со структурой - 150 единиц товара. Я под него написал модуль на drupal.

Пока мой парсер справляется с XML-фалом с 150 единицами товара, но я сильно сомневаюсь что он справиться с количеством в 20,000 товаров.


У меня самое слабое звено это параметры товара:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.             <offer id="tovar_14526" available="true">
  3.                 <name>Товар 14526</name>
  4.                 <vendor>Alfa</vendor>
  5.                 <url>http://xxx.ru/catalog/product/14526g/</url>
  6.                 <currencyId>RUB</currencyId>
  7.                 <categoryId>245</categoryId>
  8.                 <image>http://xxx.ru/tovar_14526_fedf.jpeg</image>
  9.                 <param name="Страна">Италия</param>
  10.                 <param name="Коллекция">Omega</param>
  11.                 <param name="Артикул">14526/G</param>
  12.                 <param name="Высота, мм">400</param>
  13.                 <param name="Диаметр, мм">500</param>
  14.                 <param name="Количество колёс">3</param>
  15.                 <param name="Мощность мотора, W">400</param>
  16.                 <param name="Тип мотора (основной) (новый)">Электрический</param>
  17.                 <param name="Тип кузова (новый)">Пластик</param>
  18.                 <param name="Напряжение, V">24</param>
  19.                 <param name="Степень защиты, IP">20</param>
  20.                 <param name="Виды материалов (новый)">Пластик</param>
  21.                 <param name="Материал арматуры (новый)">Металл</param>
  22.                 <param name="Материал управления (новый)">Пластик</param>
  23.                 <param name="Цвет (новый)">Белый</param>
  24.                 <param name="Цвет арматуры (новый)">Золото</param>
  25.                 <param name="Цвет кузова (новый)">Белый</param>
  26.                 <param name="Место использования (новый)">Внутри</param>
  27.                 <param name="Стиль (новый)">Классика</param>
  28.                 <param name="Форма кузова">Круглый</param>
  29.                 <param name="Дизайн (новый)">Beta</param>
  30.                 <param name="ШтрихКод">150001450060</param>
  31.                 <param name="Базовая единица">шт</param>
  32.                 <param name="Производитель">Производители/Alfa</param>
  33.                 <param name="Остаток поставщика">11</param>
  34.                 <param name="Видимость">Y</param>
  35.                 <param name="Остаток">Больше 10 шт.</param>
  36.                 <param name="Новинка">Да</param>
  37.                 <param name="Акция">false</param>
  38.                 <param name="Раздел на сайте">Машинки</param>
  39.                 <price>7172.85</price>
  40.             </offer>
  41.  


Записав в базу данных объект продукта (без параметров), я начинаю парсить сами параметры (имея уже на руках id продукта):

PHP:
скопировать код в буфер обмена
  1.  
  2.     $elements = new XMLElementIterator($reader, 'offer');
  3.     foreach ($elements as $element) {
  4.         $offer = array();
  5.        
  6.         // id
  7.         $offer['id'] = (string) $element->getAttribute('id');
  8.        
  9.         // available
  10.         if((string) $element->getAttribute('available') == 'true'){
  11.           $offer['available'] = 1;
  12.         }else{
  13.           $offer['available'] = 0;
  14.         }
  15.        
  16.         $offerSimpleXMLElement = $element->getSimpleXMLElement();
  17.        
  18.         // name
  19.         $offer['name'] = (string) $offerSimpleXMLElement->name;
  20.        
  21.         // vendor
  22.         $offer['vendor'] = (string) $offerSimpleXMLElement->vendor;
  23.        
  24.         // url
  25.         $offer['url'] = (string) $offerSimpleXMLElement->url;
  26.        
  27.         // currencyId
  28.         $offer['currencyId'] = (string) $offerSimpleXMLElement->currencyId;
  29.        
  30.         // categoryId
  31.         $offer['categoryId'] = (string) $offerSimpleXMLElement->categoryId;
  32.        
  33.         // image
  34.         $offer['image'] = (string) $offerSimpleXMLElement->image;
  35.        
  36.         // price
  37.         $offer['price'] = (string) $offerSimpleXMLElement->price;
  38.        
  39.         // save offer object in db
  40.         $i_offer_id =  _custom_function_save_current_offer($offer['id'], $offer['available'], $offer['name'], $offer['vendor'], $offer['url'], $offer['image'], floatval($offer['price']), $offer['categoryId'], $offer['categoryId']);
  41.  
  42.         $params = $offerSimpleXMLElement->param;  /// asSimpleXML  getSimpleXMLElement
  43.         foreach($params as $attribute_value){
  44.           $param = array();
  45.           foreach($attribute_value->attributes() as $attribute_name){
  46.             $param['name'] = (string) $attribute_name;
  47.             $param['value'] = (string) $attribute_value;
  48.            
  49.             if(isset($param['name']) && isset($param['value'])){
  50.               // save param obect in db
  51.               _custom_function_save_current_param($param['name'], $param['value'], $i_offer_id);
  52.             }
  53.           }
  54.         }
  55.     }
  56.  


Этот участок кода, у меня занимает полминуты. Ведь в функции _custom_function_save_current_param() я должен сначала сделать проверку, а не существует ли такой param-объект в таблице, записать если надо, потом в отдельной таблице (связь many-to-many) записать связь между offer_id и param_id.

Короче мой парсер точно захлебнётся с большим XML-файлом. Как на практике парсить разумно? Частями?
Faab Отправлено: 10 Ноября, 2014 - 14:04:35 • Тема: Правка .htaccess -> настроить Redirect • Форум: Вопросы новичков

Ответов: 2
Просмотров: 202
Как можно сделать редирект с помощью файла .htaccess

Мне надо что бы редирект срабатывал , если url начинается c games

Например:
http://mysite[dot]ru/games -> redirect yandex.ru
http://mysite[dot]ru/games/all -> redirect yandex.ru
http://mysite[dot]ru/games/test/supertest -> redirect yandex.ru
Faab Отправлено: 01 Октября, 2013 - 23:56:06 • Тема: namespace Doctrine\Common трактуется как unexpected T_STRING • Форум: Вопросы новичков

Ответов: 16
Просмотров: 567
esterio пишет:
php4 и mysqli не совместими )))


Вот из phpинфо

PHP:
скопировать код в буфер обмена
  1. MySQL Support   enabled
  2. MysqlI Support  enabled
  3. PDO drivers     mysql, sqlite, sqlite2
  4. PDO Driver for MySQL, client library version    5.1.69
  5. PDO Driver for SQLite 3.x       enabled


Для фреймвокра Doctrine хватит?
Faab Отправлено: 01 Октября, 2013 - 23:45:59 • Тема: namespace Doctrine\Common трактуется как unexpected T_STRING • Форум: Вопросы новичков

Ответов: 16
Просмотров: 567
Мелкий пишет:
Так найдите регистратора поприличнее. За 25$ в год можно даже VPS уместить вместе с доменом.


Да, соврал. Посмотрел на one.com там за местные адреса 6евро, а за .com и .org по 12евро.

Да дело не в этом же. Я реально даже справки не навёл ещё. Я устанавливаю первый сайт. Господи, я вообще сейчас о другом думаю. Придёт время, возьму я хост. Только речь же не об этом идёт.

Сначало он уверяет что таких хостов не бывает, теперь я жмот и ждёт меня печальная карьера. Он вас всегда такой "заботливый"? Может ему жениться пора?
Faab Отправлено: 18 Августа, 2013 - 21:57:56 • Тема: preg_replace() каждое n-вхождение • Форум: Вопросы новичков

Ответов: 3
Просмотров: 227
Спасибо.
Faab Отправлено: 18 Августа, 2013 - 21:04:38 • Тема: preg_replace() каждое n-вхождение • Форум: Вопросы новичков

Ответов: 3
Просмотров: 227
В строке 154 слова 'fruits'. Нужно каждое 1ое совпадение со словом fruits заменить на яблоки, каждое второе на ананасы и тд. Всего цикл из семи фруктов. Яблоками должны стать каждый 1, 8, 15 и тд...

PHP:
скопировать код в буфер обмена
  1.  
  2. $formatedtext = preg_replace("/fruits/", "appels", $unformated_text);
  3.  


Возможно ли такое?
Faab Отправлено: 08 Июля, 2013 - 10:33:36 • Тема: Сортировка массива • Форум: Вопросы новичков

Ответов: 2
Просмотров: 146
у меня два отдельных массива, у которых значение ключей идут в синхронном порядке:

Array ( [0] => 456[1] => 7854[2] => 8547[3] => 2134[4] ... )
Array ( [0] => cccc[1] => dddd[2] => bbbb[3] => aaaa[4] ... )

Как сортировать второй массив, что бы первый подвергнулся такому же алгоритму сортировки.. короче нужно просортировать два массива что бы ключи сохранили своё соответсвие.

Что делать? Сделать один массив и его сортировать, а потом назад разбить на два массива?
Faab Отправлено: 27 Июня, 2013 - 15:59:12 • Тема: К чему создавать service если есть DAO? • Форум: Вопросы новичков

Ответов: 4
Просмотров: 289
EuGen пишет:
Рискну предположить, что DAO - это Database Adapter Object. Но что такое service по мнению авторов материала - остаётся догадываться.
Про паттерн "адаптер" в общих чертах можете почитать <a href='http://ru.wikipedia.org>здесь</a>


Да, я дал мало информации. Это курс по PHP , который потом плавно вытекает к программирование на Drupal. Вот авторы просят создать 4 папки: business, presentation, data и entities.

сам контроллер лежит в root, а вид (в presentation) выкладывать не буду. Вот три файла:

entities/book.class.php


PHP:
скопировать код в буфер обмена
  1.  
  2. class Boek {
  3.    
  4.     private static $idMap = array();
  5.    
  6.     private $id;
  7.     private $title;
  8.     private $genre;
  9.    
  10.     private function __construct($id, $title, $genre){
  11.         $this->id = $id;
  12.         $this->title = $title;
  13.         $this->genre = $genre;
  14.     }
  15.    
  16.     public static function create($id, $title, $genre){
  17.         if(!isset(self::$idMap[$id])){
  18.             self::$idMap[$id] = new Boek($id, $title, $genre);
  19.         };
  20.         return self::$idMap[$id];
  21.     }
  22.    
  23.     public function getId(){
  24.         return $this->id;
  25.     }
  26.    
  27.     public function getTitle(){
  28.         return $this->title;
  29.     }
  30.    
  31.     public function getGenre(){
  32.         return $this->genre;
  33.     }    
  34.    
  35.     public function setTitle($title){
  36.         $this->title = $title;
  37.     }
  38.    
  39.     public function setGenre($genre){
  40.         $this->genre = $genre;
  41.     }
  42. }
  43.  


data/bookDAO.class.php
PHP:
скопировать код в буфер обмена
  1.  
  2. require_once('data/dbconfig.class.php');
  3. require_once('entities/genre.class.php');
  4. require_once('entities/boek.class.php');
  5.  
  6.  
  7. class BoekDAO {
  8.    
  9.     public static function getAll(){
  10.         $lijst = array();
  11.        
  12.         $dbh = new PDO(DBConfig::$DB_CONNSTRING, DBConfig::$DB_USERNAME, DBConfig::$DB_PASSWORD);
  13.        
  14.         $sql = 'SELECT boeken.id AS boekid, title, genre_id, description FROM boeken, genres WHERE genre_id = genres.id';
  15.        
  16.         $resultSet = $dbh->query($sql);
  17.        
  18.         foreach($resultSet as $resultRow){
  19.             $genre = Genre::create($resultRow['genre_id'], $resultRow['description']);
  20.             $boek = Boek::create($resultRow['boekid'], $resultRow['title'], $genre);
  21.             array_push($lijst, $boek);
  22.         };
  23.        
  24.         $dbh = null;
  25.        
  26.         return $lijst;
  27.     }
  28.    
  29.     public static function getById($id){
  30.         $dbh = new PDO(DBConfig::$DB_CONNSTRING, DBConfig::$DB_USERNAME, DBConfig::$DB_PASSWORD);
  31.        
  32.         $sql = 'SELECT boeken.id AS boekid, title, genre_id, description FROM boeken, genres WHERE genre_id = genres.id AND boeken.id = '.$id;
  33.        
  34.         $resultSet = $dbh->query($sql);
  35.        
  36.         $resultRow = $resultSet->fetch();
  37.        
  38.         $genre = Genre::create($resultRow['genre_id'], $resultRow['description']);
  39.        
  40.         $boek = Boek::create($resultRow['boekid'], $resultRow['title'], $genre);
  41.        
  42.         $dbh = null;
  43.        
  44.         return $boek;
  45.     }
  46.    
  47.     public static function create($title, $genre_id){
  48.        
  49.         $sql = 'INSERT INTO boeken (title, genre_id) VALUES ("'.$title.'", '.$genre_id.')';
  50.        
  51.         $dbh = new PDO(DBConfig::$DB_CONNSTRING, DBConfig::$DB_USERNAME, DBConfig::$DB_PASSWORD);
  52.        
  53.         $dbh->exec($sql);
  54.         $boekId = $dbh->lastInsertId();
  55.        
  56.         $dbh = null;
  57.        
  58.         $genre = GenreDAO::getById($genre_id);
  59.         $boek = Boek::create($boekId, $title, $genre);
  60.        
  61.         return $boek;
  62.     }
  63. }


business/bookservice.class.php

PHP:
скопировать код в буфер обмена
  1. require_once('data/boekDAO.class.php');
  2.  
  3. class BoekService {
  4.    
  5.     public static function showAllBooks(){
  6.         $lijst = BoekDAO::getAll();
  7.         return $lijst;    
  8.     }
  9.    
  10.     public static function addNewBook($title, $genre_id){
  11.         BoekDAO::create($title, $genre_id);
  12.     }
  13. }


Я не стал выкладывать все файлы, выставил только три, что касается одного энтити, - книги. Мой главный вопрос этого топика: для чего нужна папка business? В контроллере я обращаюсь BoekService::addNewBook($title, $genre); Но я жу могу также обратиться и так BoekDAO::create($title, $genre_id);?
Faab Отправлено: 27 Июня, 2013 - 15:34:12 • Тема: К чему создавать service если есть DAO? • Форум: Вопросы новичков

Ответов: 4
Просмотров: 289
Вот в учебном материале сказано: создайте DAO и service. Простыми грубыми словами: DAO служит абстрактной прослойкой с ДБ, а сервис описавает методы для DAO. Обычно: 1 service для одного DAO. А я так и не понимаю цели service. Разве нельзя описать поведение сразу в DAO?

Спасибо

Страниц (6): [1] 2 3 4 5 6 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB