Chatblock und High-performance JavaScript callback handler
am 14.05.2014 - 14:36 Uhr in
Guten Tag !
Ich habe das folgende Problem:
Das Modul Chatblock benötigt um ordentlich zu arbeiten das Modul High-performance JavaScript callback handler.
Dieses aber, will bei mir einfach nicht funktionieren. Laut der Installationsanweisung, muss man das .htaccess modifizieren und js.php ins / Verzeichniss kopieren, die Zeilen sind vorgegeben:
Add:
# Rewrite JavaScript callback URLs of the form js.php?q=x.
RewriteCond %{REQUEST_URI} ^\/([a-z]{2}\/)?js\/.*
RewriteRule ^(.*)$ js.php?q=$1 [L,QSA]
RewriteCond %{QUERY_STRING} (^|&)q=((\/)?[a-z]{2})?(\/)?js\/.*
RewriteRule .* js.php [L]Damit sieht meine .htaccess wie folgt aus:
#
# Apache/PHP/Drupal settings:
#
# Protect files and directories from prying eyes.
<FilesMatch "\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig\.save)$">
Order allow,deny
</FilesMatch>
# Don't show directory listings for URLs which map to a directory.
Options -Indexes
# Follow symbolic links in this directory.
Options +FollowSymLinks
# Make Drupal handle any 404 errors.
ErrorDocument 404 /index.php
# Set the default handler.
DirectoryIndex index.php index.html index.htm
# Override PHP settings that cannot be changed at runtime. See
# sites/default/default.settings.php and drupal_environment_initialize() in
# includes/bootstrap.inc for settings that can be changed at runtime.
# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
php_flag magic_quotes_gpc off
php_flag magic_quotes_sybase off
php_flag register_globals off
php_flag session.auto_start off
php_value mbstring.http_input pass
php_value mbstring.http_output pass
php_flag mbstring.encoding_translation off
</IfModule>
# Requires mod_expires to be enabled.
<IfModule mod_expires.c>
# Enable expirations.
ExpiresActive On
# Cache all files for 2 weeks after access (A).
ExpiresDefault A1209600
<FilesMatch \.php$>
# Do not allow PHP scripts to be cached unless they explicitly send cache
# headers themselves. Otherwise all scripts would have to overwrite the
# headers set by mod_expires if they want another caching behavior. This may
# fail if an error occurs early in the bootstrap process, and it may cause
# problems if a non-Drupal PHP file is installed in a subdirectory.
ExpiresActive Off
</FilesMatch>
</IfModule>
# Various rewrite rules.
<IfModule mod_rewrite.c>
RewriteEngine on
# Rewrite JavaScript callback URLs of the form js.php?q=x.
RewriteCond %{REQUEST_URI} ^\/([a-z]{2}\/)?js\/.*
RewriteRule ^(.*)$ js.php?q=$1 [L,QSA]
RewriteCond %{QUERY_STRING} (^|&)q=((\/)?[a-z]{2})?(\/)?js\/.*
RewriteRule .* js.php [L]
# Set "protossl" to "s" if we were accessed via https://. This is used later
# if you enable "www." stripping or enforcement, in order to ensure that
# you don't bounce between http and https.
RewriteRule ^ - [E=protossl]
RewriteCond %{HTTPS} on
RewriteRule ^ - [E=protossl:s]
# Make sure Authorization HTTP header is available to PHP
# even when running as CGI or FastCGI.
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Block access to "hidden" directories whose names begin with a period. This
# includes directories used by version control systems such as Subversion or
# Git to store control files. Files whose names begin with a period, as well
# as the control files used by CVS, are protected by the FilesMatch directive
# above.
#
# NOTE: This only works when mod_rewrite is loaded. Without mod_rewrite, it is
# not possible to block access to entire directories from .htaccess, because
# <DirectoryMatch> is not allowed here.
#
# If you do not have mod_rewrite installed, you should remove these
# directories from your webroot or otherwise protect them from being
# downloaded.
RewriteRule "(^|/)\." - [F]
# If your site can be accessed both with and without the 'www.' prefix, you
# can use one of the following settings to redirect users to your preferred
# URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option:
#
# To redirect all users to access the site WITH the 'www.' prefix,
# (http://example.com/... will be redirected to http://www.example.com/...)
# uncomment the following:
# RewriteCond %{HTTP_HOST} .
# RewriteCond %{HTTP_HOST} !^www\. [NC]
# RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#
# To redirect all users to access the site WITHOUT the 'www.' prefix,
# (http://www.example.com/... will be redirected to http://example.com/...)
# uncomment the following:
# RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
# RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]
# Modify the RewriteBase if you are using Drupal in a subdirectory or in a
# VirtualDocumentRoot and the rewrite rules are not working properly.
# For example if your site is at http://example.com/drupal uncomment and
# modify the following line:
# RewriteBase /drupal
#
# If your site is running in a VirtualDocumentRoot at http://example.com/,
# uncomment the following line:
# RewriteBase /
# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]
# Rules to correctly serve gzip compressed CSS and JS files.
# Requires both mod_rewrite and mod_headers to be enabled.
<IfModule mod_headers.c>
# Serve gzip compressed CSS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]
# Serve gzip compressed JS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.js $1\.js\.gz [QSA]
# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]
<FilesMatch "(\.js\.gz|\.css\.gz)$">
# Serve correct encoding type.
Header set Content-Encoding gzip
# Force proxies to cache gzipped & non-gzipped css/js files separately.
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>
</IfModule>Aber auch nach der Installation und den Modifikationen wird das Chat Fenster zwar angezeigt, jedoch werden keine Nachrichten angezeigt. Ohne den JavaScript callback handler
funktioniert der Chat super, jedoch zieht er die Performance der Seite ziemlich runter.
Woran kann es liegen ? Ich bin für jeden Tipp dankbar !
MfG
Daniil
- Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Daniel, gebe bitte
am 14.05.2014 - 21:28 Uhr
Hallo Daniel,
gebe bitte immer deine Drupal Version mit an, die Modulconfig von Drupal 6 zu 7 kann recht unterschiedlich sein.
Was steht denn bei dir unter: /admin/reports/status ?
Dort sollte stehen:
JavaScript callback handler Einwandfrei installiert
The JavaScript callback handler has been installed correctly.
Die js.php muß direkt im Hauptverzeichnis liegen, also dort wo auch die zuständige .htaccess liegt.
Deine .htaccess scheint richtig zu sein, meine sieht gleich aus und bei mir läuft js, lediglich meine php Version ist noch eingetragen, glaube aber nicht das es daran liegt, meine .htaccess fängt wie folgt an:
AddHandler php-fastcgi5.3 .php .php5 .phtml
#
# Apache/PHP/Drupal settings:
#
Treffen die nachstehenden 2 Bedingungen von der Modulseite ebenfalls bei dir zu?
Requirements
- Your server must support URL rewrites. E.g. in Apache, you need mod_rewrite enabled.
- Clean URLs need to be activated in your Drupal setup.
Grüße Jenna
Zitat: Was steht denn bei dir
am 15.05.2014 - 00:10 Uhr
Was steht denn bei dir unter: /admin/reports/status ?
Dort steht alles richtig installiert.
Die js.php muß direkt im Hauptverzeichnis liegen
Genau so ist es.
Requirements
- Your server must support URL rewrites. E.g. in Apache, you need mod_rewrite enabled.
- Clean URLs need to be activated in your Drupal setup.
Beides trifft zu.
Leider sind mir jetzt auch die Ideen ausgegangen... Drupal Version ist 7.28, aber auch mit 7.27 getestet.
Das Modul ist leider sehr wichtig, es gibt für mich keine ausweich Alternativen.
Mit freundlichen Grüßen
Daniil
Hi, ein Fehler sollte Dir
am 15.05.2014 - 07:14 Uhr
Hi,
ein Fehler sollte Dir zumindest angezeigt werden.
Hast Du mal in Firebug nachgesehen?
Was passiert den wenn Du den Callback Handler direkt aufrufst?
Rewrite JavaScript callback URLs of the form js.php?q=x.
Entweder in Firebug,Watchdog oder im PHP error log sollte ein Fehler angezeigt werden.
Gruss
Robert
Stimmt an Firebug hatte ich
am 15.05.2014 - 10:55 Uhr
Stimmt an Firebug hatte ich nicht gedacht, hier was im Log steht so bald ich eine Nachricht über das Chat Modul schicke:
Drupal.chatblock.sendMessage/<.error()js_TUl...Mv44.js (Zeile 732)
XMLHttpRequest = XMLHttpRequest { readyState=4, timeout=0, withCredentials=false, mehr...}
textStatus = "parsererror"
errorThrown = "Invalid JSON: Fatal err...rlay.module on line 131"
.handleError()js_xAP...FkyQ.js (Zeile 143)
a = Object { url="/js/chatblock/update", global=true, type="POST", mehr...}
b = XMLHttpRequest { readyState=4, timeout=0, withCredentials=false, mehr...}
d = "parsererror"
e = "Invalid JSON: Fatal err...rlay.module on line 131"
.ajax/w.onreadystatechange()js_xAP...FkyQ.js (Zeile 142)
m = readystatechange
console.error(XMLHttpRequest.status);
Leider sagt mir das nicht viel, kann Jemand weiterhelfen ? Wie gesagt das Modul funktioniert ohne den JS Callback Handler super, nur langsam.
MfG
Daniil
Hallo Daniel, na, das ist
am 15.05.2014 - 11:54 Uhr
Hallo Daniel,
na, das ist doch schon etwas.
So wie es aussieht gibt der Request kein gültiges JSON zurück.
errorThrown = "Invalid JSON: Fatal err...rlay.module on line 131"
Hast Du das Overlay Modul am laufen?
Dann probier das mal auszuschalten.
Bei einem JSON Request sollte es sicher kein Overlay geben.
MfG
Robert
Okay du hattest recht,
am 15.05.2014 - 12:01 Uhr
Okay du hattest recht, Overlay war am laufen. Deaktiviert, nun werden auch die Nachrichten im Chat angezeigt, aber nicht automatisch aktualisiert.
Der Fehler im Log hat sich auch verändert:
error()js_TUl...Mv44.js (Zeile 732)
XMLHttpRequest = [unsupported: no toString() function in type object] {}
textStatus = "parsererror"
errorThrown = "Invalid JSON: Fatal err...common.inc on line 2260"
handleError()js_xAP...FkyQ.js (Zeile 143)
a = [unsupported: no toString() function in type object] {}
b = [unsupported: no toString() function in type object] {}
d = "parsererror"
e = "Invalid JSON: Fatal err...common.inc on line 2260"
onreadystatechange()js_xAP...FkyQ.js (Zeile 142)
m = [unsupported: no toString() function in type object] {}
console.error(XMLHttpRequest.status);
Hmm,es gibt immer noch
am 15.05.2014 - 12:21 Uhr
Hmm,
es gibt immer noch invalid JSON zurück aber nun offensichtlich
beim aktualisieren des Requests.
Warscheinlich gibt der Request auch HTML und nicht reines JSON zurück
Kann es sein dass Du irgendwo noch Debug Messages (dsm,dpm,print_r,var_dump) ausgibst?
Poste mal das HTML/JSON Source Code den dieser Request ausgibt.
Gruss
PS:
Wenn es Dir um Performance geht bist Du mit diesem node.js
wahrscheinlich besser bedient, sofern Dein Server dies unterstützt.
https://drupal.org/project/nodejs_chat
Da dieser mit Websockets arbeitet wird
a. Die Verbindung zu Chat offengehalten
b. Drupal nicht gebootstapped.
c. Die Nachrichten nicht gepullt sondern gepushed (realtime)
;-)
du findest den fehler leichter
am 15.05.2014 - 12:59 Uhr
wenn du einen remoting proxy einsetzt.
Ich nehme dafür Charles.
Hmm dein Vorschlag mit dem
am 15.05.2014 - 14:08 Uhr
Hmm dein Vorschlag mit dem NodeJS_Chat hört sich so gut an, dass ich als erstes dieses Modul als Alternative teste. Falls alles läuft erweist sich ja die Fehlersuche bezüglich des Chatblocks als unnötig =)
Ich melde mich wieder !
Gruß
Daniil
Das Modul macht auch
am 15.05.2014 - 16:01 Uhr
Das Modul macht auch Probleme...
Leider erhalte ich "The Chat channel couldn't be created" über dem leeren Chat Fenster.
Sieht wohl so aus als wäre meine Node.js Installation fehlerhaft, jedoch erhalte ich sonst keinerlei Fehlermeldungen.
In der Modulauflistung bei Drupal sieht alles super aus, die Konfiguration von Node.Js ist eigentlich richtig und alle extensions für den Chat sind gestartet:
/*** This configuration file was built using the 'Node.js server configuration builder'.
* For a more fully commented example see the file nodejs.config.js.example in the root of this module
*/
backendSettings = {
"scheme":"http",
"host":"localhost",
"port":8080,
"key":"/path/to/key/file",
"cert":"/path/to/cert/file",
"resource":"/socket.io",
"publishUrl":"publish",
"serviceKey":"",
"backend":{
"port":80,
"host":"localhost",
"messagePath":"/nodejs/message"},
"clientsCanWriteToChannels":true,
"clientsCanWriteToClients":true,
"extensions":["/nodejs_chat.module.js"],
"debug":false,
"transports":["websocket",
"flashsocket",
"htmlfile",
"xhr-polling",
"jsonp-polling"],
"jsMinification":true,
"jsEtag":true,
"logLevel":1};
Was mache ich falsch =) ?
P.S.: In der Installationsanleitung für Node.js steht als letzter Punkt man solle den nodeJS server starten. dies kann ich jedoch nicht, da ich nur FTP Zugang zum Server habe. Macht Drupal dies nicht automatisch bei der Installation/Änderung der Einstellungen ?
Gruß
Daniil
das ist genau der Punkt,
am 15.05.2014 - 16:20 Uhr
an dem Charles Licht ins Dunkel bringen kann.
Hallo nochmal,wenn der
am 15.05.2014 - 16:29 Uhr
Hallo nochmal,
wenn der nodeJS Server nicht gestartet ist kann er keinen Channel dort erstellen.
Normalerweise startet man nodeJS Server per Shell Skript nachdem der Server neu booted.
Einen Server manuell starten ist grundsätzlich schlecht.
Stell Dir vor Dein Server OS booted started aber den Webserver nicht automatisch.
Hast Du Zugriff auf Plesk oder Webmin mit denen Du solche Services starten kannst?
LG
PS:
Rolands Tipp die Requests durch einen Proxy zu jagen ist durchaus erwähnenswert.
So siehst Du ob die Requests überhaupt durchgehen(Firewall blockt port 8080?).
Ich habe gerade gesehen das
am 15.05.2014 - 16:32 Uhr
Ich habe gerade gesehen das sich an dem Drupal Chat eine Menge getan hat, finde es ja sehr performance schonend solche Anwendungen auszulagern wenn finanziell irgendwie machbar bzw. sinnvoll...
Hier gibt es beide Varianten, entweder mit node.js oder über den genannten Anbieter, wenn es etwas kosten darf.
https://drupal.org/project/drupalchat
Grüße Jenna
Zitat: Hier gibt es beide
am 15.05.2014 - 16:49 Uhr
Hier gibt es beide Varianten, entweder mit node.js oder über den genannten Anbieter, wenn es etwas kosten darf.
Leider ist der Chat nicht passend für mein Vorhaben. Ich brauche ein ChatBlock auf einer der Seiten, nicht als Seitenübergreifendes Modul für alle.
Hast Du Zugriff auf Plesk oder Webmin mit denen Du solche Services starten kannst?
Dies ist vorübergehend nur eine Testumgebung auf einem billigen Webspace, nachher wird die Seite auf einen eigenen Server migriert wo ich natürlich alles so einrichten kann wie es mir passt. So lange ich das Projekt aber erst entwickle, was noch bis zu 2 Monate dauert, möchte ich den eigenen Server nicht mieten und die Entwicklung so weit wie möglich auf dem jetzigen Stand führen.
Ich habe Zugriff auf das Webinterface Parallels Confixx und natürlich phpMyAdmin. Leider kann man von dort aus so weit ich weiß nichts wirklich hilfreiches machen. Ich werde mal meinen Anbieter anschreiben, vielleicht kann dieser mir entgegenkommen falls es keine andere Möglichkeit gibt.
Grüße
Daniil
Hi Daniil,wenn es nur eine
am 16.05.2014 - 09:06 Uhr
Hi Daniil,
wenn es nur eine Testumgebung ist, kannst Du den Dienst auch durch
ein PHP Skript Manuell starten (PHP exec).
Erstelle Dir ein php Skript das Dir das Server .js Skript auf dem Server startet wie hier:
http://stackoverflow.com/questions/8620636/trigger-node-js-file
Dann kannst Du versuchen ob Du per Telnet eine Verbindung zum Server Port (8080?) bekommst.
Alternativ für Testumgebung:
Du könntest den node.js Server auch bei Dir lokal laufen lassen, allerdings musst Du dann
Deinen Router richtig konfigurieren, dass Deine lokale Maschine von aussen erreichbar ist (e.g. Exposed Host).
Bei der Drupal node.js konfiguration musst Du dann die externe IP Deines Routers eintragen.
Der Router soll die Anfragen dann zu Deiner lokalen Maschine leiten.
Freundliche Grüsse
Robert
Vielen Dank Robert, sehr
am 16.05.2014 - 09:12 Uhr
Vielen Dank Robert, sehr interessante Informationen ! An PHP exec. habe ich nicht gedacht, werde ich versuchen. Im Notfall halt wirklich lokal !
Gruß
Daniil
Leider bin ich noch immer
am 09.06.2014 - 16:22 Uhr
Leider bin ich noch immer nicht weitergekommen.
Jetzt läuft mein Projekt auf einem dedicated root server, auf dem ich auch node.js laufen habe neben apache2.
Leider habe ich mit dem oben beschriebenen auf NodeJS basierenden chat noch immer Probleme, habe auch bereits ein Thema eröffnet:
http://www.drupalcenter.de/node/51092
Weil ich da nicht weiterkomme, habe ich mir überlegt doch wieder den Chatblock einzusetzen. Jedoch auch da kriege ich den Javascript Callback Handler nicht zum laufen.
Auch auf diesem Server der selbe Fehler wie am Anfang des Themas beschrieben.
Hat Jemand noch eine Idee ?