$formula = '{var1} / {var2}'; // можно сложить, умножить, делить и т.д.
$var1 = 100; // тип может быть float
$var2 = 2; // тип может быть float
$var3 = '/';
switch ($var3) {
case '/':
$result = $var1 / $var2;
break;
...
}
ORM и PDO не нужно, слишком проект простой и должен быть быстрым
А почему вы решили что ORM и PDO, это медленно? Вернее, почему вы решили, что написанная вами обертка для работы с БД будет работать быстрее? Я уже не говорю о безопасности.
Ну да бог с ними, с ORM и PDO, будем работать с специализированным драйвером, но почему нельзя воспользоваться встроенной системой байндинга? Забудем о безопасности, но ведь при байндинге, запрос подготавливается и на стороне СУБД кешируется план, что опять же влияет на скорость.
В общем, для простых проектов есть простые и быстрые решения.
Зависит от того, как будете использовать эти данные, если забираете все скопом, и только так, то можно и в одну ячейку засунуть. Но в таком случае весь смысл использования реляционной СУБД теряется, и логичнее применить что-то вроде Redis.
Тогда обновляйте последовательно. Транзакция на truncate и добавление 50к не должна создать проблем для хорошего сервера СУБД. Таблица не перегружена индексами?
Задача в теме была описана. Запустить интерактивный (не завершающийся сразу, требующий ввода от пользователя) процесс, и управлять вводом-выводом через сокет.
Наберитие "man unix", там в конце пример клиент-серверного приложения общающихся по unix-сокету. Весь man нельзя выложить, но вот пример:
spoiler
EXAMPLE
The following code demonstrates the use of sequenced-packet sockets for local interpro‐
cess communication. It consists of two programs. The server program waits for a connec‐
tion from the client program. The client sends each of its command-line arguments in
separate messages. The server treats the incoming messages as integers and adds them up.
The client sends the command string "END". The server sends back a message containing
the sum of the client's integers. The client prints the sum and exits. The server waits
for the next client to connect. To stop the server, the client is called with the com‐
mand-line argument "DOWN".
The following output was recorded while running the server in the background and repeat‐
edly executing the client. Execution of the server program ends when it receives the
"DOWN" command.
Example output
$ ./server &
[1] 25887
$ ./client 3 4
Result = 7
$ ./client 11 -5
Result = 6
$ ./client DOWN
Result = 0
[1]+ Done ./server
$
int
main(int argc, char *argv[])
{
struct sockaddr_un name;
int down_flag = 0;
int ret;
int connection_socket;
int data_socket;
int result;
char buffer[BUFFER_SIZE];
/*
* In case the program exited inadvertently on the last run,
* remove the socket.
*/
ret = connect (data_socket, (const struct sockaddr *) &addr,
sizeof(struct sockaddr_un));
if (ret == -1) {
fprintf(stderr, "The server is down.\n");
exit(EXIT_FAILURE);
}
/* Send arguments. */
for (i = 1; i < argc; ++i) {
ret = write(data_socket, argv[i], strlen(argv[i]) + 1);
if (ret == -1) {
perror("write");
break;
}
}
/* Request result. */
strcpy (buffer, "END");
ret = write(data_socket, buffer, strlen(buffer) + 1);
if (ret == -1) {
perror("write");
exit(EXIT_FAILURE);
}
/* Receive result. */
ret = read(data_socket, buffer, BUFFER_SIZE);
if (ret == -1) {
perror("read");
exit(EXIT_FAILURE);
}
/* Ensure buffer is 0-terminated. */
buffer[BUFFER_SIZE - 1] = 0;
printf("Result = %s\n", buffer);
/* Close socket. */
close(data_socket);
exit(EXIT_SUCCESS);
}
For an example of the use of SCM_RIGHTS see cmsg(3).
SEE ALSO
recvmsg(2), sendmsg(2), socket(2), socketpair(2), cmsg(3), capabilities(7), creden‐
tials(7), socket(7), udp(7)
COLOPHON
This page is part of release 5.00 of the Linux man-pages project. A description of the
project, information about reporting bugs, and the latest version of this page, can be
found at https://www.kernel.org/doc/man-pages/.
Illidan Stormrage, скорее всего устройства не поддерживают высокоскоростной интерфейс, попробуйте выгрузить модуль ehci, чтобы остался только ohci. Возможно стоит даже попробовать uhci. Я с таким не сталкивался, но, думаю, копать нужно в эту сторону.
Антон Шелестов, еще можете посмотреть скорость работы через "show profile", убедиться что exists отвратительная по производительности конструкция, т.к. выполняется для каждой строки и заменить ее join.
time_is_always_against_us, SHARE MODE никогда не использовал. Насколько знаю, это больше для сохранения целостности БД, если мы добавляем зависимые данные, а в это время данные от которых зависим могут быть удалены. Обычно, я решал это, либо не в СУБД, либо процедурой с exception. То, что вы описываете, обычно не решают на стороне СУБД. Мнения разнятся, но большинство считает, что логика должна лежать в одном месте, и как правило, это не СУБД.
Проверьте FOR UPDATE, там должны быть дополнительные параметры блокировки, вам в идеале нужно блочить только ячейку. При такой блокировке, другой SELECT легко пройдет, если в нем нет работы с этой ячейкой. Ну и, все засовывайте в одну транзакцию, блокировки снимаются и по окончанию транзакции тоже.