PHP - писать в формате doc
Какую библиотеку посоветуете что бы из PHP создать документ в формате DOC?
Какую библиотеку посоветуете что бы из PHP создать документ в формате DOC?
Обратил внимание что в последнее время основная часть багов в технологиях касающихся веб разработки связана так или иначе с обработкой utf-8 строк. Насколько опасно применение юникода в продакшн? Целесообразно ли его применение если веб приложение рассчитано в основном на англоязычных пользователей (для возможности расширения аудитории в будущем)?
Написал небольшое приложение с помощью pyramid. Всё работает прекрасно, но если делать слишком много конкурентных запросов (>50) появляются такие ошибки:
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 51307)
Traceback (most recent call last):
File "/usr/lib64/python2.7/SocketServer.py", line 284, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/lib64/python2.7/SocketServer.py", line 310, in process_request
self.finish_request(request, client_address)
File "/usr/lib64/python2.7/SocketServer.py", line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib64/python2.7/SocketServer.py", line 641, in __init__
self.finish()
File "/usr/lib64/python2.7/SocketServer.py", line 694, in finish
self.wfile.flush()
File "/usr/lib64/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
Как устранить эту проблему? Или она возникает из-за нехватки ресурсов (открытых сокетов OS, и т.д.)? В таком случае какие конфиги/опции ядра в линуксе регулируют количество этих ресурсов?
Как включить в python raw string single backslash?
>>> print r'\\'
\\
>>> print r'\n'
\n
>>> print r'\''
\'
>>> print r'\'
File "<stdin>", line 1
print r'\'
^
SyntaxError: EOL while scanning string literal
>>>
Каким то странным образом работает запуск PHP скрипта в background'е в redhat. Появляется один процесс, сразу же выходит, появляется какой то второй но он ничё не пишет в логи. Может быть имеет значение - на том компе работаю через ssh. Дома в gentoo linux всё работает нормально. Всю жизнь работаю с gentoo, redhat недолюбливаю, наверно потому что не понимаю. Ну вот что это за глюки:
# php down.php
Processing 00000
Processing 00001
Processing 00002
Processing 00003
Processing 00004
Processing 00005
Processing 00006
Processing 00007
Processing 00008
^C
# php down.php >log 2>log &
[1] 15152
#
[1]+ Stopped php down.php > log 2> log
# ps auxw | grep php
root 15152 0.2 1.1 225388 6004 pts/0 T 12:21 0:00 php down.php
root 15199 0.0 0.1 103292 844 pts/0 S+ 12:22 0:00 grep php
# kill -KILL 15152
# cat log
[1]+ Killed php down.php > log 2> log
# cat log
#
#
# uname -a
Linux scrappy2012 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
# gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
# php -v
PHP 5.3.3 (cli) (built: Feb 2 2012 23:47:49)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
#
Запускал с правами root что бы продемонстрировать что это не проблема прав доступа к чему либо. В не root аккаунте такая же точно история. Что за глюк? Как бороться?
Что означают такие результаты как Deviation 2, Average 3, Median 3? Throughput 21473.094/minute это я так понимаю сколько запросов было сделано за минуту в среднем?
create table items (
id bigserial primary key,
name varchar(255) not null
);
create table categories (
id bigserial primary key,
name varchar(255) not null unique
);
create table items_categories (
item_id bigint not null references items(id),
category_id bigint not null references categories(id)
);
Такое выдаст только одну из возможных категорий item'а:
select items.*, items_categories.category_id from items inner join items_categories on items.id = items_categories.item_id
можно ли как то получить все категории в одном запросе или надо делать отдельный запрос для получения категорий?
Сильно ли различается производительность если в качестве Primary Key использовать строку а не число, например:
create table users (
username varchar(32) primary key,
...
);
create table posts (
owner varchar(32) not null REFERENCES users,
...
);
В любом случае приятнее иметь профили в виде http://domain.com/users/tyler вместо http://domain.com/users/8434.
Аналогично int/bigint сильно влияет на производительность?
Сабдж. Если удаляется row из referenced table атомично ли удаление rows из referenced table? Или другая сессия может в это время увидеть rows с foreign key указывающим на уже удалённый id?
Нравится ruby. Не нравится rails - слишком громоздкий. Нравится sinatra. Какие ещё ruby framework'и можно посмотреть что бы не слишком громоздкие наподобие sinatra?
Планируется запуск системы которая будет включать несколько частей в том числе:
- веб приложение - DB (PostgreSQL) - скрипт рассылки уведомлений по почте (уведомлений может быть много) - скрипт рассылки уведомлений по XMPP
Возник ряд вопросов.
- Лучше заказать 1 dedicated server подороже и более производительный и иметь на нём и веб приложение и DB? Или лучше вынести DB в отдельную машину?
- Если скрипт рассылки почты будет работать на машине отличной от машины с веб приложением. Пусть машина с веб приложением будет иметь доменное имя domain.com. Отосланные email должны иметь From: <something>@domain.com. Не возникнет ли проблем со спам фильтрами из за того что рассылаться они будут с IP который не привязан к domain.com? Как лучше поступить?
- Существуют ли какие то методы как оценить возможности машины - сколько запросов в секунду сможет обработать. Кроме как наглазок - т.к. опыта системного администрирования нагруженной системы не имею. Понятно что зависит от многих факторов, есть ли какие то методики определения? Веб приложение не производит никаких вычислений и т.д. а просто выводит/вводит данные в DB.
Имеется таблица: accounts: id, name, ..., balance balance никогда не должен становится меньше 0 Подскажите решение по переводу суммы с balance одного account'а на balance другого. Очень много читал туториалов по транзакциям но так и не понял как сделать.
Понятно что:
START TRANSACTION;
UPDATE accounts SET balance = balance - $amount WHERE id = $from;
UPDATE accounts SET balance = balance + $amount WHERE id = $to;
COMMIT;
Но как гарантировать что balance всегда >= 0? Что если другая транзакция в это время обновит balance? Проблема распростанённая, так что скорее всего достаточно хорошо известная. Но что то не могу ничего найти сам что бы быть уверенным в безопасности получившейся системы. Lock tables не хорошо для производительности, может какие то тригеры которые ROLLBACK в случае если balance < 0?
Требуется добавить возможность прикреплять файлы к приватным сообщениям. Файлы естественно может видеть только юзер которому предназначено сообщение. Очевидным решением является хранить файлы где то outside web accessible directory и после проверки php скриптом юзера в текущей сессии выдавать либо файл либо access denied. Что то типа:
<?php
/* ....... */
if (isset($_SESSION['user'])) {
/* check user */
} else {
exit("Access Denied!");
}
$fc = file_get_contents($file);
header("Content-Type: {$fileContentType});
echo $fc;
Встаёт вопрос оптимизации производительности. Понятно что читать большой файл в PHP с целью его последующего вывода не оптимально. Что можете предложить? Может существуют какие то готовые решения для этого.
Так же вопрос. Если информацию по всем файлам хранить в MySQL в таблице `files` а сам файл соответственно в <some_dir>/`files.id` где `files.id` - primary key из files то при большом кол-ве файлов не будет ли притормаживать. Есть ли смысл раскладывать файлы по сабкаталогам. И какую FS лучше выбрать для раздела с этими файлами что бы оптимизировать?
Имеется код:
#include "wx/wx.h"
class MyApp : public wxApp {
public:
virtual bool OnInit();
};
class MyFrame : public wxFrame {
public:
// Constructor
MyFrame(const wxString& title);
void DrawSimpleShapes();
// Event handlers
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
private:
// This class handles events
DECLARE_EVENT_TABLE();
};
// Implements MyApp & GetAPP()
DECLARE_APP(MyApp);
// Give wxWidgets the means to create a MyApp object
IMPLEMENT_APP(MyApp);
// Initialize the application
bool MyApp::OnInit() {
MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));
frame->Show(true);
frame->DrawSimpleShapes();
return true;
}
// Event table from MyFrame
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
END_EVENT_TABLE()
void MyFrame::OnAbout(wxCommandEvent& event) {
wxString msg;
msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);
wxMessageBox(msg, wxT("AboutMinimal"), wxOK | wxICON_INFORMATION, this);
}
void MyFrame::OnQuit(wxCommandEvent& event) {
Close();
}
MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title) {
wxMenu *fileMenu = new wxMenu;
fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
wxMenu *helpMenu = new wxMenu;
helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"), wxT("Show about dialog"));
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, wxT("&File"));
menuBar->Append(helpMenu, wxT("&Help"));
SetMenuBar(menuBar);
CreateStatusBar(2);
SetStatusText(wxT("Welcome to wxWidgets!"));
}
void MyFrame::DrawSimpleShapes() {
wxClientDC dc(this);
// Set line colour to black, fill colour to green
dc.SetPen(wxPen(*wxBLACK, 2, wxSOLID));
dc.SetBrush(wxBrush(*wxGREEN, wxSOLID));
// Draw a point
dc.DrawPoint(5, 5);
wxMessageBox(wxT("Hi"), wxT("Hello"), wxICON_INFORMATION, this);
// Draw a line
dc.DrawLine(10, 10, 100, 100);
}
Рисуется в окне только то что стоит после wxMessageBox в посл. ф-ции. Что стоит перед ней не рисуется (т.е. точка). Если её убрать тогда вообще ничего не рисуется. Что происходит?
Имеется система которая в настоящее время уведомляет пользователей о событиях по email. По ряду причин это не очень удобно. Есть желание рассылать оповещения через jabber. Посоветуйте какой софт брать для этой цели, насколько эффективно это будет (сколько пользователей потянет, сколько памяти и процессорного времени пожрёт и т.д.).
Собственно сабж. http://www.mysql.com/products/workbench/ не понравился. Во первых упал один раз по непонятным причинам. Во вторых не устраивает как показываются связи между таблицами. Линия просто входит в таблицу в произвольном месте а хотелось бы что бы сразу было видно к какому полю таблицы она идёт.
Ваше отношение к OOP. Хорошо или плохо? Почему все говорят что OOP код проще читать? Я наблюдаю обратное. Берём какой нибудь OOP код и вместо того что бы увидеть реализацию алгоритма имеем сотни если не тысячи каких то мелких методов, классов. И со всеми ими надо ознакомиться что бы понять сущность написанного. И что самое неприятное - каждый из этих классов, функций, методов использует ещё дохера других. Такая вот рекурсия. Очень бесит что OOP суют везде. Разобраться со OOP кодом намного сложнее чем с алкоритмическим.
RTMPE на youtube: что за новая гадость и как пользоваться? rtmpdump пишет:
Connecting ... WARNING: HandShake: Type mismatch: client sent 6, server answered 9
WARNING: HandShake: Server not genuine Adobe!
ERROR: RTMP_Connect1, handshake failed.
Так чем скачать? Что добавить в параметры?
В общем задолбался две ночи подряд выяснять в чём дело. Не могу залогиниться в гугл https://accounts.google.com/ServiceLoginAuth. Что только не делал. Отчаялся реализовать с помощью CURL ф-ций, взял и написал с fsockopen который посылает абсолютно идентичный POST. Всё бесполезно. Проклятый гугл всё равно не залогинивает.
Имеется код:
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, "http://upload.uploadstation.com/upload/1674884/1/?sessionId=8b4efded-4975-4a2a-ad6c-0b858048fe42&callback=jQuery161026690326338862833_1322892321329&_=1322892321339");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Host: upload.uploadstation.com",
"User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language: en-us,en;q=0.5",
"Accept-Encoding: gzip, deflate",
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
"Connection: keep-alive",
"Cache-Control: max-age=0",
));
curl_setopt($ch, CURLOPT_VERBOSE, 1);
echo curl_exec($ch);
curl_close($ch);
Сервер возвращает код 400 Bad Request:
* About to connect() to upload.uploadstation.com port 80 (#0)
* Trying 108.61.5.227... * connected
* Connected to upload.uploadstation.com (108.61.5.227) port 80 (#0)
> GET /upload/1674884/1/?sessionId=8b4efded-4975-4a2a-ad6c-0b858048fe42&callback=jQuery161026690326338862833_1322892321329&_=1322892321339 HTTP/1.1
Host: upload.uploadstation.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cache-Control: max-age=0
< HTTP/1.1 400 Bad Request
< Server: Apache-Coyote/1.1
< Content-Type: text/html;charset=utf-8
< Content-Length: 971
< Date: Sat, 03 Dec 2011 06:23:24 GMT
< Connection: close
<
* Closing connection #0
<html><head><title>Apache Tomcat/6.0.32 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect ().</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/6.0.32</h3></body></html>
Абсолютно такой же запрос через браузер возвращает правильный результат (LiveHTTP headers):
http://upload.uploadstation.com/upload/1674884/1/?sessionId=8b4efded-4975-4a2a-ad6c-0b858048fe42&callback=jQuery161026690326338862833_1322892321329&_=1322892321339
GET /upload/1674884/1/?sessionId=8b4efded-4975-4a2a-ad6c-0b858048fe42&callback=jQuery161026690326338862833_1322892321329&_=1322892321339 HTTP/1.1
Host: upload.uploadstation.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cache-Control: max-age=0
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Expires: Mon, 28 Sep 1970 06:00:00 GMT
Cache-Control: private,no-cache,no-store
Pragma: no-cache
Content-Type: text/javascript
Transfer-Encoding: chunked
Date: Sat, 03 Dec 2011 06:16:37 GMT
Найдите отличия.
следующие → |