Параметри пошуку (Сторінка 1 з 2)
Ласкаво просимо!
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Теми користувача Intrerio Виконати пошук
Знайдені повідомлення: з 1 по 20 з 27
Droid 77 написав:Intrerio написав:Доброго вечора. Ніколи не думав про багатопоточність бо не було такої потреби раніше. Зараз стикнувся з проблемою у часі виконання певного циклу.
Є масив, що включає в себе перелік певних методів у різних класах. За своїм принципом всі ці методи несуть одну і ту ж дію, але містять різні дані. В циклі foreach я викликаю ці методи передаючи в них певний набір даних (він завжди різний), а вони в свою чергу роблять curl запит на віддалені сервіси API. Потім я в цих же методах привожу все до єдиного вигляду і запаковую в асоціативний масив і вивожу далі. Працювало все чудово до поки таких віддалених запитів було 20-30. А коли їх стало біля 100 то час проходу став значно більшим і це доставляє певний дискомфорт.
Перечитав про багатопоточність curl, але це не те рішення, що може допомогти. Чи є взагалі варіанти які б дозволили паралельно виконовувати інтерації циклу не чекаючи завершення попередньої ітерації?
Так самі не бачите з свого опису що подібна задача багатопоточна?
Цеж Вам не статична сторінка з лінками кудись там .. , і досвідос.
Ви серйозно? Ви вважаєте багатопоточністю динаміку? А статичну сторінку з набором css стилів та html не багатопоточністю?
Давайте я спочатку поясню принцип будь-якого циклу в PHP foreach, for чи while. Кожна ітерація (коло проходу циклу) виконується по факту завершення попереднього. Наприклад:
for($i = 0; $i < 5; $i++) {
echo $i;
}
Тобто цикл виконуватиметься до поки 5 більше $i. Але в даному випадку кожна наступна ітерація $i++ не може бути виконана, поки не завершена попередня. Це дуже примітивний приклад і якщо замінити echo $i на щось типу Class::Method то наступна ітерація не почнеться поки не буде виконано Class::Method. А мені потрібно асинхронно виконати Class::Method не чекаючи завершення попереднього.
Betterthanyou написав:Вже давно не працював з PHP тому можу помилятися, але здається в PHP є pthreads через який можна організувати багато-потоковість
https://www.php.net/manual/en/book.pthreads.php - Документація
https://www.sitepoint.com/parallel-prog … damentals/ - Приклад
class Task extends Threaded
{
private $value;
public function __construct(int $i)
{
$this->value = $i;
}
public function run()
{
usleep(250000);
echo "Task: {$this->value}\n";
}
}
$pool = new Pool(4);
for ($i = 0; $i < 15; ++$i) {
$pool->submit(new Task($i));
}
while ($pool->collect());
$pool->shutdown();
Як варіант. Зараз спробую
Доброго вечора. Ніколи не думав про багатопоточність бо не було такої потреби раніше. Зараз стикнувся з проблемою у часі виконання певного циклу.
Є масив, що включає в себе перелік певних методів у різних класах. За своїм принципом всі ці методи несуть одну і ту ж дію, але містять різні дані. В циклі foreach я викликаю ці методи передаючи в них певний набір даних (він завжди різний), а вони в свою чергу роблять curl запит на віддалені сервіси API. Потім я в цих же методах привожу все до єдиного вигляду і запаковую в асоціативний масив і вивожу далі. Працювало все чудово до поки таких віддалених запитів було 20-30. А коли їх стало біля 100 то час проходу став значно більшим і це доставляє певний дискомфорт.
Перечитав про багатопоточність curl, але це не те рішення, що може допомогти. Чи є взагалі варіанти які б дозволили паралельно виконовувати інтерації циклу не чекаючи завершення попередньої ітерації?
VTrim написав:Я не знаю Свіфт, але ви все одно будете кожного разу надсилати дані для авторизації, надсилаючи нехай куки (не тимчасову сесію) через headers (що більш логічно).
Можете пошукати якесь локальне сховище даних, якась кеш-пам'ять, тощо, що послугує для збереження даних авторизації.
Якщо я правильно розумію то логічно буде створити під час успішної авторизацію якийсь хеш, зберегти його в БД проекту + в локальному сховищі мобільного додатку і під час кожного запиту порівнювати ці два рядки даних?
Доброго дня друзі. Останнім часом дуже зацікавився мовою програмування SWIFT і так як вже повністю працює наш проект на PHP з власною API просто гріх було б не створити мобільний додаток для проекту. Зараз поясню суть проблеми яка постала на моєму шляху. Є АРІ написана на PHP яка приймає JSON массив та проводить відповідні дії. Обмін даними між додатком та АРІ вже налаштував. Зараз прийшов час до авторизації користувачів. На сервері дані авторизації лежать у вигляді номеру телефону та паролю в подвійному md5. По суті відправка даних та отримання відповіді проходить без проблем. Але я так і не знайшов адекватної статті як же ж відкрити сесію для користувача,щоб не слати ці дані при кожному запиті. Підкажіть, як після успішної авторизації відкрити сесію для користувача в swift?Дякую
Re: Масив (15 відповідей, залишених у PHP)
koala написав:Може, покажете, що вийшло?
Якраз дописую загальний код і скоро викину. Щоправда SQL запит буду завтра змінювати
Re: Масив (15 відповідей, залишених у PHP)
koala написав:Ну гаразд, тоді замість нових рядків додавайте інформацію в масив. Тільки він буде аж ніяк не асоціативний - ви ж самі писали щось про $ar[$company['id']][] - от пусті дужки в кінці показують, що масив не асоціативний. І доведеться розглядати всюди по два випадки - коли масив-елемент масиву верхнього рівня уже створений і коли його ще немає.
Вцілому варіант,який вийшов робочий. Шкода що дуже громісткий. Люблю, щоб все було компактно, а тут не зовсім вийшло компактно. Сподіваюсь після досягнення поставленої цілі все ж повернусь і перероблю в більш гарний вигляд. Дякую за допомогу
Re: Масив (15 відповідей, залишених у PHP)
if(isset($_POST['create'])){
for($i=0;$i<count($_POST['agreementId']);$i++){
$agreement = Agreements::getAgreementById($_POST['agreementId'][$i]);
$product = Products::getProductById($agreement['product_id']);
$company = Company::getCompanyById($product['company_id']);
$ar['companyId'][$company['id']]['id'] = $company['id'];
$ar['companyId'][$company['id']]['productId'][$product['id']]['id'] = $product['id'];
$ar['companyId'][$company['id']]['productId'][$product['id']]['agreements'][$agreement['id']] = $agreement['id'];
}
}
Цикл який формує масив який мені потрібен ось такий
$arr = array();
$i = 0;
foreach ($ar['companyId'] as $c){
$arr[$i]['companyId'] = $c['id'];
foreach ($c['productId'] as $g){
$arr[$i]['products'][] = $g;
}
$i++;
}
Покищо прийшов до такого вигляду. Зараз ще заміную запит в БД на один і може щось в процесі підкорегую. До кращого варіанту я поки прийти не зміг
Re: Масив (15 відповідей, залишених у PHP)
koala написав:SQL приблизно такий:
SELECT Company.Name as Company, Product.Name as Product, Agreement.Number as Agreement
FROM Company INNER JOIN Agreement ON Company.ID == Agreement.CompanyID
INNER JOIN Product ON Product.ID == Agreement.CompanyID
WHERE Agreement.ID IN ( agreementId1, agreementId2, ...)
Список в дужках можна отримати за допомогою
join(",",$_POST['agreementId'])
Тепер - як обробляти результат (припустимо, його перегнали в масив, хоча краще прямо з ресурсу через fetch_assoc витягати)
$old_company = NULL;
$old_product = NULL;
for($i=0;$i<count($result);++$i) //чи while($row = $result->fetch_assoc()) {
{
$row = $result[$i];
if($row['Company']!=$old_company) {
$old_company = $row['Company'];
$old_product = NULL;
//створюємо новий рядок про компанію
}
if($row['Product']!=$old_product) {
$old_product = $row['Product'];
//створюємо новий рядок про продукт
}
//стоворюємо новий рядок про $row['Agreement']
}
Звісно, конкретні назви полів ви маєте краще знати.
Ваш варіант гарний і запит швидше буде оброблено, ніж мої три і це факт. Проте цикл виведе змінні, якщо додати перед = ще крупку .= то буде набір рядків, але в моєму випадку потрібно власне створити массив в якому буде зберігатись ієрархія
Компанія
Продукт
Договір
Після цього як я розкладу все по поличкам мені треба створити відповідний запис в БД, що буде означати ідентифікатор звіту і на базі якого буде згенеровано xls і pdf файл відповідними бібліотеками. Я от зараз ніби прийшов вже до якогось рішення, але всеодно воно не ідеальне. Поки ще модифіковую. Стосовно Вашого прикладу SQL запиту то погоджуюсь на всі 100% що він оптимальніший, ніж викликати три різні запити і витягувати всі поля.
Re: Масив (15 відповідей, залишених у PHP)
Ось так:
Компанія 1
Продукт 1
Договір1
Договір 2
КОмпанія 2
Продукт3
Договір 10
Договір 20
Пояснюю по звіту. Є продані послуги різних компаній. Кожна послуга це окремий договір. Договір відноситься до якогось продукту. От мені треба написати такий скрипт в якому я передаю купу ідентифікаторів договорів, а скрипт розкладе це по поличкам, а саме по компаніям і продуктам відносно компаній
Re: Масив (15 відповідей, залишених у PHP)
koala написав:foreach ($arr as $companyId => $prod_agr)
foreach($prod_agr as $productId => $agreementId) {
//зробити щось на "поличці" $companyId, $productId, $agreementId
}
Або детальніше розпишіть, що є в таблицях. Як співвідносяться компанії та продукти, n:n чи 1:n? Скільки може бути угод на один продукт? Що, зрештою, треба робити в кінці - може, треба скласти один складний запит до БД, а не кілька простих, а потім зліплювати?
Ось цим принчипово різниться український форум від російських, тут є діалог:-).
Спробую по максимуму описати:
1. Що я роблю? Створюю звіт для заключених договорів в розрізі компаній та продуктів
2. Як проводиться вибірка? Є сторінка на якій виводяться всі договори і останнім стовпцем іде checkbox де value=agreementId
3. Що передається? Основною є таблиця з договорами agreements.Як вже зрозуміло id в таблиці agreements і є value checkbox. Методом $_POST я закидаю масив в цикл де починає проводити наступні маніпуляції
4.Які маніпуляції? В циклі я витягую дані по договору з таблиці agreements. З цієї таблиці мені потрібен стовпчик productId WHERE id = agreementId. Взявши productId я мушу зрозуміти якій компанії належить даний продукт і відповідно роблю запит в таблицю products звідки беру companyId .
5. Інші. Як видно з усього вище викладеного ми маємо наприклад 90 договорів, які укладені наприклад на 3 компанії.Доприкладу:
Компанія 1 уклала 30 договорів з них 10 договорів мають ідентифікатор продукту productId = 1,10 договорів productId = 2 і 30 договорів productId = 3. Відповідно якщо це буде компанія 2 то ідентифікатори вже будуть інші.
Ось десь так виглядає задум. Мало би бути щось схоже на це:
$ar[$company['id']][][$product['id']][] = $agreement['id']
але виникає проблема як потім цей дурдом в циклі розкласти по ідентифікаторам
Re: Масив (15 відповідей, залишених у PHP)
koala написав:Просто масив масивів. Перед циклом:
$arr = array();
Всередині:
if(array_key_exists($companyId, $arr))
$arr[$companyId][$productId] = $agreementId;
else
$arr[$companyId] = array( $productId => $agreementId );
Вибачте, пишу з телефона і взагалі давно на PHP не писав.
Я подібний масив вже пробував зробити, навіть дещо коротше, але виникає наступна проблема, як потім його в циклі вийняти по поличкам companyId,productId та відповідно agreementId адже порядковим номером елементу в масиві буде ідентифікатор компанії чи продукту і key=>value вже не дуже допомагає або я просто туплю на вечір
Re: Масив (15 відповідей, залишених у PHP)
if(isset($_POST['create'])){
for($i=0;$i<count($_POST['agreementId']);$i++){
$agreement = Agreements::getAgreementById($_POST['agreementId'][$i]);
$product = Products::getProductById($agreement['product_id']);
$company = Company::getCompanyById($product['company_id']);
}
}
це для розуміння
Тема: Масив (15 відповідей, залишених у PHP)
Привіт друзі.Маю логічний ступор на етапі розробки одного сервісу.
Є массив з ідентифікаторами ID.Беру for і перебираю масив. Під час перебору роблю запит в БД і витягую ще два ідентифікатори companyId та productId.Ці. два ідентифікатори хаотично повторюються. І тепер власне запитання:
Потрібно зробити асоціативний масив такого вигляду:
companyId1=>productId1=>agreementId1
companyId1=>productId1=>agreementId2
companyId1=>productId2=>agreementId3
і так далі. Другу годину хожу по колу і нічого не можу придумати
А є така можливість?))) Ще один маленький плюс для адміністраторів проекту. Кожному адміністратору свого проекту надається повний доступ до шаблону сайту і повне право розміщення рекламних блоків на своєму сайті.
Як на мене то тут не політика, а просто майбутнє НЕЗАЛЕЖНОСТІ України. Вибачте,якщо не так щось
Шановні друзі, збираємось на мітинг під кордоном Польщі на Краківці та Мостиськах. Давайте разом, багатотисячним натовпом попросимо у Європи допомоги, давайте разом покажемо Європі наше бажання бути разом з ЄС. Робіть репост повідомлення. Хто бажає приєднатись пишіть в приват http://сайт-злодій/intrerio або на електронку intrerio89@gmail.com або за телефоном 0677700555
Він десь і надихнув мене на створення власного проекту. Просто як на мене проект Міста України вузькопрофільний (геополітичний), а в моєму баченні даний проект включає інформаційний ресурс, розважальний, соціальний та ін. Я хочу втілити в життя проект соціальної допомоги використовуючи даний портал і т.д. Словом на одному проекті має бути все, що може цікавити пересічного користувача веб-мережі
Я неодноразово задавав собі це питання, але так і не зміг дати відповідь однозначно. Цей сайт має мати і велику новинарну базу, соціальну мережу, розважальні сервіси, обов*язково історію міст та різноманітну цікаву інформацію про міста. Словом я хочу створити проект такого плану, щоб коли людина на нього заходить, вже не було сенсу з нього йти. Я виокремив для себе основний контент на який припадає попит користувачів і власне його я в першу чергу буду розвивати.Я знаю точно, що можна створити універсальний портал на якому користувач може згаяти час незважаючи на його вік чи погляди, головне з головою до цього підійти.
І забув сказати, інформація з усіх піддоменів (новини) буде виводитись на головній сторінці головного домену
Знайдені повідомлення: з 1 по 20 з 27