LINUX.ORG.RU

sleep, файлы или как передавать данные из php в c++ бинарник

 , , ,


0

3

Доброе времени суток
как бы вы решали задачу
максимально просто передать текст «123»
из php на локалхосте в с++ бинарник на локалхосте
пробовал через http, но оно не стабильно работает
решил навелосипедить через файлы, родил такой код
он ждёт пока php создаст входной файл, затем он читает из него строку и удаляет файл и снова ждёт

оно конечно работает, но эти слипы сьедают cpu на переключениях контекста если этот код запускать многоразово....

как вы сделали вечный забор строк из файла без слипов?
или какой способ передачи «123» из php в с++ бинарник выбрали бы вы?

while (true) {

ifstream number_file("number_file");

if (!number_file){
std::this_thread::sleep_for(std::chrono::milliseconds(10));
number_file.close();
continue; }

getline(number_file, number);

if ((number.empty()) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
continue; }  


////////////some actions
std::remove("number_file");
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}

★★★★★

вообще я ищу какой-то простой топорный способ

что неужели передавать 123 из php в с++ это сложно

smilessss ★★★★★
() автор топика

Какая-то шизофазия. Если есть сишный демон, добавь ему какой-то ipc. В линуксе традиционео через сокет, а пых пусть в этот сокет срет 123.

Anoxemian ★★★★★
()
Ответ на: комментарий от smilessss

А что сложного то? IPC aka Inter Process Communication довольно обыденная штука, к томуже судя по формулировке топика, метод уже есть, но он не нравится, pipe’ы самое оно, один процесс пишет в дескриптор, второй читает, сложное это шареные блоки памяти с правами доступа, а остальное вполне банальщина

sparks ★★★★
()
Ответ на: комментарий от Anoxemian

а если сишных демонов 8000 - будет 8000 ipc и 8000 сокетов?

через сокеты можно сделать без слипов с блокировками?

smilessss ★★★★★
() автор топика
Ответ на: комментарий от sparks

через IPC можно сделать без слипов?

там есть встроеные блокировки?

мне не нужна замена ifstream number_file(«number_file»);

оно вполне себе работает и не жужжит

меня беспокоят слипы

т.к. это костыль и вызывает тормоза

smilessss ★★★★★
() автор топика
Ответ на: комментарий от smilessss

слип это чисто твоя придурь. мамонты selectили, диды epollили, смузихлебы uvlibят и все счастливы. не нравятся сокеты забабахай что-то другое. пайп, да элементарный mkfifo пойдет.

Anoxemian ★★★★★
()
Ответ на: комментарий от smilessss

Можно, в linux почти всё IO сводится к системным вызовам read и write, а с каким именно сокетом (AF_INET, AF_UNIX…) ассоциирован дескриптор и будет ли он блокирующим, это уже по вкусу

sparks ★★★★
()
Ответ на: комментарий от smilessss

Передавать строку через файл это извращение. Вместо того, чтобы передать человеку предмет из рук в руки, ты ставишь шкаф и кладёшь в него предмет, чтобы человек взял его оттуда и убрал шкаф. Самому не кринжово от такого бреда?

alex1101
()
Ответ на: комментарий от alex1101

зато это просто с точки зрения реализации

в php

$log = fopen("/file", "w+");
              fwrite($log, $message);
              fclose($log);
}


всё остальное намного сложнее и не безотказнее этого

smilessss ★★★★★
() автор топика
Последнее исправление: smilessss (всего исправлений: 1)
Ответ на: комментарий от smilessss

Первый попавшийся снипет со stackoverflow выглядит вполне простым и решающим все сложности

<?php
$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
socket_sendto($socket, "Hello World!", 12, 0, "/tmp/myserver.sock", 0);
echo "sent\n";
?>
sparks ★★★★
()
Ответ на: комментарий от sparks

осталось понять как это разможить на 8000 с++ бинарей
так чтобы можно было разобраться что куда ушло

smilessss ★★★★★
() автор топика
Ответ на: комментарий от sparks

есть c++ 10000 бинарей
есть php код
мне нужно из php как-то распихивать данные в с++ бинари
желательно чтобы это 10000 бинарей не делали
sleep
каждые 10 мсек в ожидании входных данных

smilessss ★★★★★
() автор топика
Ответ на: комментарий от smilessss

У тебя машина с 10000 ядер? Зачем тебе 10000 процессов?

Вообще, создаёшь на каждый процесс по специальному файлу через mkfifo. В каждом процессе приемнике открываешь соответствующий файл и читаешь его в блокирующем режиме без всяких слипов.

В php пишешь в эти файлы. Просто пишешь.

При отсутствии данных принимающий процесс будет сам спать, без твоей помощи.

KivApple ★★★★★
()
Ответ на: комментарий от smilessss

mkfifo это интересно, пойду тестить

smilessss ★★★★★
() автор топика
Ответ на: комментарий от smilessss

Если не вникать что наверняка присутствует пара сервисов, где один написан на с++ и один на php и надо организовать общение между ними, а сфокусироваться на 1000 файлах, то в c++ берём inotify и если известны все имена файлов, то вешаем ожидание события на все из них IN_CLOSE_WRITE, дальше select который будет ждать пока в один из файликов которые мониторятся придёт событие, если имена файлики появляются походу, то вешаем событие и на директорию и проверяем свеже созданные файлы

sparks ★★★★
()
Ответ на: комментарий от smilessss

пойду читать про блокирующее чтение с файла в с++ с ifstream

smilessss ★★★★★
() автор топика
Ответ на: комментарий от smilessss

Это поведение по умолчанию хоть сишных fopen/fread, хоть сплюплюсного std::fstream.

Но читать надо именно файл созданный mkfifo. Обычный файл будет читаться до упора, а после EOF мгновенно возвращаться 0 байт. А вот fifo хитрее, туда можно подкидывать данные, а читатель будет блокироваться в их ожидании.

KivApple ★★★★★
()
Ответ на: комментарий от smilessss

Только на первый взгляд, в с++ по умолчанию все из fstream и так блокирующее, а mkfifo это как раз пайпы, рекомендованные в первом же коменте

sparks ★★★★
()
Ответ на: комментарий от sparks

в с++ по умолчанию все из fstream и так блокирующее

судя по
«Обычный файл будет читаться до упора, а после EOF мгновенно возвращаться 0 байт»

в моём случае с того что там что-то по умолчанию блокирующее профита нет

мне нужно пробовать сделать файлы через mkfifo
потом писать в них с php
потом читать их в с++
и надеяться что оно сработает правильно

smilessss ★★★★★
() автор топика
Ответ на: комментарий от Anoxemian

он скоро вернётся, для такого решения в лоб, придётся держать 10к потоков висящих на блокирующем read, что не звучит рационально

sparks ★★★★
()

из php на локалхосте в с++ бинарник на локалхосте

это называется не из php в c++, а из изолированного окружения куда-то там. Вы же именно это имеете в виду, php внутри вебь-сервера.

Штатные базы sql/redis/etc или отдельный rest/websocket-rpc

PS/ если уж прибило мониторить файлы то inotify..но через файлы дико криво

MKuznetsov ★★★★★
()

или какой способ передачи «123» из php в с++ бинарник выбрали бы вы?

Какой-нибудь брокер сообщений, например, RabbitMQ.

raspopov
()
Ответ на: комментарий от MKuznetsov

php внутри вебсервера это какая-то чушь, пахнет апачем.

Ни при чём тут окружения, он просто ipc пытается сделать через какой-то ужас.

firkax ★★★★★
()
Ответ на: комментарий от smilessss

Что за бредятину ты придумал? 10000 чего-то там (ещё стоит выяснить что конкретно скрывается за словами «10000 бинарей») это уже чистый идиотизм и никакие дальнейшие способы что-то им сообщать ситуацию не исправят.

И ещё

распихивать данные в с++ бинари

вот эта фраза - тоже полнейшая чушь. «Бинарь» это файл с машинным кодом. Если ты в него «распихаешь» данные, то машинного кода в нём уже не будет и он перестанет работать по назначению. И с++ тут ни при чём. Например, если ты хочешь «распихать» в бинарь /bin/sh строку 123, то это делается так:

echo 123 > /bin/sh

(от рута) но осторожно, после этого у тебя сломается шелл и придётся чинить систему.

firkax ★★★★★
()

Создай пайп, читай его

mittorn ★★★★★
()
Ответ на: комментарий от smilessss

есть c++ 10000 бинарей

Если они все запущены на одной машине то это плохо. Очень. Это очень большая нагрузка на ОС. Если речь про какой-то набор устройств и эти «бинари» на самом деле работают по сети - вопрос в способах коммуникации: как именно оно общается с сервером на php.

Если вариант «как обычно» и бинари просто шлют запрос на центральный сервер - ну сделай стандартную связку через базу, благо 10к клиентов не так много пока они не дергают сервер каждую секунду.

alex0x08 ★★★
()

Через командную строку передавай.

ya-betmen ★★★★★
()
Ответ на: комментарий от smilessss

есть c++ 10000 бинарей

Сделай через rabbitmq

10000 бинарей

И к наркологу сходи)

goingUp ★★★★★
()

php my.php | my_cpp_app Если пхп запущен в рамках сервера, ну типа в апаче там то mkfifo mypipe и пусть пхп в него пишет, а цпуспус из него читает

Википедия

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от firkax

php внутри вебсервера это какая-то чушь, пахнет апачем.

ооо, осень, этого опять кроет.

Anoxemian ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.
Тема будет перемещена в архив .