Tak si to zkus precist a prelozit :) Zatim to vypada, ze si to nadelis jako vanocni darek pod stromecek tak, ci tak :)
Příspěvky odeslané z IP adresy 193.84.207.–
https://jsfiddle.net/39gsp6q2/
- js fiddle se nelibylo asi, ze pouzivam f, tak jsem to zmenil na fff
- a take, na konci ma byt misto /script
<script>
...
</script>
Co jsi nasel googlem?
Vetsinou to funguje tak, ze se pouziva neco jako curl. Samozrejme o VB nic nevim, takze netusim, jak se to tam jmenuje. Ve VB mozna pujde otevrit browser.
Co jsem nasel ja googlem?
Dim Client as new WebClient
Client.DownloadFile(Source, Destination)
Client.Dispose
---
Private Shared Sub DownloadImage(url As String, saveFilename As String)
Dim httpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
Dim httpWebResponse = DirectCast(httpWebRequest.GetResponse(), HttpWebResponse)
If (httpWebResponse.StatusCode <> HttpStatusCode.OK AndAlso httpWebResponse.StatusCode <> HttpStatusCode.Moved AndAlso httpWebResponse.StatusCode <> HttpStatusCode.Redirect) OrElse Not httpWebResponse.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase) Then
Return
End If
Using stream = httpWebResponse.GetResponseStream()
Using fileStream = File.OpenWrite(saveFilename)
Dim bytes = New Byte(4095) {}
Dim read = 0
Do
If stream Is Nothing Then
Continue Do
End If
read = stream.Read(bytes, 0, bytes.Length)
fileStream.Write(bytes, 0, read)
Loop While read <> 0
End Using
End Using
End Sub
----
https://www.digitalcoding.com/…rom-URL.html
''' <summary>
02
''' Function to download Image from website
03
''' </summary>
04
''' <param name="_URL">URL address to download image</param>
05
''' <returns>Image</returns>
06
Public Function DownloadImage(ByVal _URL As String) As Image
07
Dim _tmpImage As Image = Nothing
08
09
Try
10
' Open a connection
11
Dim _HttpWebRequest As System.Net.HttpWebRequest = CType(System.Net.HttpWebRequest.Create(_URL), System.Net.HttpWebRequest)
12
13
_HttpWebRequest.AllowWriteStreamBuffering = True
14
15
' You can also specify additional header values like the user agent or the referer: (Optional)
16
_HttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
17
_HttpWebRequest.Referer = "http://www.google.com/"
18
19
' set timeout for 20 seconds (Optional)
20
_HttpWebRequest.Timeout = 20000
21
22
' Request response:
23
Dim _WebResponse As System.Net.WebResponse = _HttpWebRequest.GetResponse()
24
25
' Open data stream:
26
Dim _WebStream As System.IO.Stream = _WebResponse.GetResponseStream()
27
28
' convert webstream to image
29
_tmpImage = Image.FromStream(_WebStream)
30
31
' Cleanup
32
_WebResponse.Close()
33
_WebResponse.Close()
34
Catch _Exception As Exception
35
' Error
36
Console.WriteLine("Exception caught in process: {0}", _Exception.ToString())
37
Return Nothing
38
End Try
39
40
Return _tmpImage
41
End Function
' Download web image
02
Dim _Image As Image = Nothing
03
_Image = DownloadImage("http://www.youdomain.com/sample-image.jpg")
04
05
' check for valid image
06
If _Image IsNot Nothing Then
07
' show image in picturebox
08
pictureBox1.Image = _Image
09
10
' lets save image to disk
11
_Image.Save("C:\\sample-image.jpg")
12
End If
Njn, kdyz ty mu davas takhle komplexni objekt, to se pak neni cemu divit :) Zkus tam dat
console.log(response[i].propertyitems[0].value) // nebo
console.log(JSON.stringify(response[i].propertyitems[0].value))
Jinak, podle obrazku to vypada, ze to mas prekodovane na base64. Do src by to mozna fungovalo
img.src = "data:image/jpeg;base64," + response[i].propertyitems[0].value;
// ale, to neni jiste, by se muselo zkusit
Kazdopadne, jak pises, zmenil jsi vystup, to je lepsi reseni.
Navic, v tom prikladu onmessage spousteji nad objektem channel.port1, nikoliv wondow nebo iframewindow.
Nevim, jak vypada cely js kod, ale od pohledu bych tipnul, ze event je udalost prohlizece. A pokud si pamatuji, ty nemaji polozku message.
event.data.message === "start"
Netusim, co ti to pise do logu, takovy vypis jsi neposkytnul, takze o tom ani nebudu spekulovat.
console.log(event.data);
someElement.addEventListener('message', function(event) {...}) - by melo byt totez jako
someElement.onMessage() = function (event) {...} - kde event byva obvykle udalost mysi, klavesnice, httprequestu
addEventListener('message', function(event) {...}) - v tomto pripade je element objekt window
https://developer.mozilla.org/…ventListener#…
https://developer.mozilla.org/…eb/API/Event
Podle dokumentace mozilly event zadne message nevraci.
web-socket message, link z te stranky eventu
https://developer.mozilla.org/…MessageEvent
To tam ma onmessage malymi pismeny, nezvykle.
V tom pripade nemuzes zachytavat pres listener, ale musis pouzit tu funkci. To je totiz funkce jineho objektu nez window. Neni to klasicky event, ale uz primo callback funkce.
https://developer.mozilla.org/en-US/docs/Web/API/MessagePort/postMessage
var channel = new MessageChannel();
var para = document.querySelector('p');
var ifr = document.querySelector('iframe');
var otherWindow = ifr.contentWindow;
ifr.addEventListener("load", iframeLoaded, false);
function iframeLoaded() {
otherWindow.postMessage('Hello from the main page!', '*', [channel.port2]);
}
channel.port1.onmessage = handleMessage;
function handleMessage(e) {
para.innerHTML = e.data;
}
vsude melo byt $_REQUEST, samy preklep, cim jsem starsi :)
Netusim z popisu, jak presne ti to funguje.
Checkboxy resim tak, ze mam zvlast tabulku propojeni (id_item_produkt, id_typ_checkboxu, id_item_checkbox).
Kdyz edituji id_item_produkt=112233 a zaskrtnu jine checkboxy, tak smazu vsechny z tabulky propojeni, kde id_item_produkt=112233 a pridam nove podle toho, jake jsou zaskrtnute.
(id_item_produkt, id_typ_checkboxu, id_item_checkbox)
(112233=knihaXYZ, 1=autor, 1=Ales)
(112233=knihaXYZ, 1=autor, 2=Tomas)
(112233=knihaXYZ, 1=autor, 3=Pepa)
Druha moznost je, vytvorit si tabulku propojeni se strukturou (id_item_produkt, checkbox1, checkbox2, ...). Pri Updatu produktu vynulujes odpovidajici radek a prepises na 1 vsechny zaskrtnute
(id_item_produkt, checkbox1, checkbox2, ...)
(112233=knihaXYZ, true=Ales, true=Tomas, true=Pepa, false=Franta, false=Jenda)
google = MS Access sql dotaz dynamicka promenna
Snad ti to pomuze, neznam access.
Dim com As New SqlCommand("SELECT * FROM Pohyby_stajaky WHERE Datum >= @Datum_od AND Datum <= @Datum_do Order By Cislo, Datum", "váš connectionstring") 'Vytvoříme SqlCommand
com.Parameters.AddWithValue("Datum_od", Now) '1. parametr
com.Parameters.AddWithValue("Datum_do", Now.AddDays(20)) '2. parametr
Dim r As SqlDataReader
com.Connection.Open() 'Otevřeme připojení
r = com.ExecuteReader() 'Získáme data
com.Connection.Close() 'Zavřeme připojení
#8 MilanL
== je standard v mnoha jazycich, typove je ===
Jen nektere opakuji podle pascalu a=b, protoze pascal mel a:=b. Takze to bylo v pohode. Ale pak se prislo na to, ze pro prirazeni je lepsi rovnitko. A najednou se preslo u podminek na ==.
= tusim pouziva jeste python a visual basic. Z tech, co jsem nekdy pouzil :)
Pak se jeste pro prirazeni/spojovani pouziva = php/js, += php/js a .= php. Tady to dava logicky smysl, pouzit rovnitko a nedava smysl pouzit rovnitko v podmince. Protoze oba jazyky umoznuji v podmince priradit. coz se hodne casto pouziva, protoze do ifko vykonava jen do prvni kladne vyhodnoceme podmince pri spojeni s ||.
if (c==3 || a=funkcexyz() && a==1 || a==c && bb==2)
// je to pak podobne zapisu:
bool = false;
if (c==3) {...}
else { a=funkcexyz(); if (a==1) {...} else (a==c && bb=2) {...} }
// vyhodou je, ze nezatezujes program vyhodnocovanim funkce,
// ktera muze trvat nejaky cas. To by byl alternativni zapis tento
a=funkcexyz();
if (c==3 || a==1 || a==c && bb==2)
// tady tu funkci musis provest vzdy, kvuli podmince
// kdezto v prvnim pripade IF skonci treba castokrat podminkou c==3
// a na volani funkce nedojde
Jako, je to mysleno dobre, ale prijde mi prehlednejsi pouzivat == a === do podminek.
Ok. takze na webu je to dobre. V databazi je to nejak, ale zobrazi se to dobre.
Takze data mas dobre, neni treba provadet opravy po jednom znaku. Proste je vytahni najednou.
Zjisti, jake prikazy pouziva web pro databazi (jestli pouziva SET NAMES a jake kodovani nebo zadne, pak zjisti default kodovani sql, ve kterem ti to posila). Zjisti, jak ti to web zobrazuje. A prekoduj to.
Cili, jak jsem psal, priklad.
Db ma default kodovani LATIN1.
Web nema SET NAMES, takze se pripojuje k db s kodovanim LATIN1. (A uklada to do tabulky, ktera ma treba UTF, na tom vubec nesejde, protoze to uklada do tabulky v latin1; informace o kodovani v tabulce je pouze informativni, nemusi odpovidat tomu, jak jsou kodovany data).
Na web to zobrazujes jako utf8, treba, php header(...utf8). A zobrazi se znaky spravne, diakritika.
Cili, ty musis udelat to, ze php scriptem vytahnes data a nasoukas je zpet. A pak opravis ve svem programu SET NAMES na utf8. Mezitim by bylo dobre, aby jsi cely program zablokoval, bud prepnout do nejakeho rezimu udrzby v programu, pokud to umoznuje. A nebo pres htaccess vsechno presmeroval na nejakou html stranku, oznamujici udrzbu. At ti nam nikdo needituje.
V programu pak mas
SET NAMES latin1 nebo nic. Vytahnes data. Nastavis SET NAMES na UTF. Ulozis data. Kompletne cele tabulky i s id-autoincremencem a tak. (mozna je prikaz na kopii cele tabulky, ale nevim, zda se u toho da nastavit kodovani)
(ted by se to melo v phpmyadminu nebo nejakem tom programu na databazi zobrazovat ok)
Doporucuji zalozit si duplicitni tabulky nebo databazi bokem a cely prevod realizovat tam. A pak v programu nastavit, ze ma zobrazovat data z jine database.
Nevim, zda jsem to popsal dobre. Zkus treba poslat vzorek exportu. A pridej informaci o nastaveni db a strukturu tabulky. Priklad:
-- phpMyAdmin SQL Dump
-- version 4.0.10deb1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Feb 18, 2019 at 10:39 AM
-- Server version: 5.6.33-0ubuntu0.14.04.1-log
-- PHP Version: 5.5.9-1ubuntu4.21
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */; -- tento radek je dulezity
--
-- Database: `EvidenceActivity`
--
--
-- Table structure for table `s_link`
--
CREATE TABLE IF NOT EXISTS `s_link` (
`idpril` int(10) unsigned NOT NULL AUTO_INCREMENT,
`iduser` int(10) unsigned NOT NULL DEFAULT '0',
`idsem` int(10) unsigned NOT NULL DEFAULT '0',
`idpred` int(10) unsigned NOT NULL DEFAULT '0',
`idtmp` int(10) unsigned NOT NULL DEFAULT '0',
`nazev` varchar(255) NOT NULL DEFAULT '',
`link` varchar(255) NOT NULL DEFAULT '',
`logdate` date NOT NULL DEFAULT '0000-00-00',
`loguser` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`idpril`),
KEY `idsem` (`idsem`),
KEY `idpred` (`idpred`),
KEY `idtmp` (`idtmp`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=193 ; -- a tento radek je dulezity (teda, spis informativni, ale kdybych delal pokus na tvych datech, jak si mam nastavit tabulku a ladit do te doby nez mi to phpmyadmin zobrazi ok)
Tam jsem oznacil 2 radky, ktere jsou dulezite.
"Funguje mi i to co tu dal peter. " - Dik, ale jen jsem zkusil gna reseni popsat trochu jinak. Ono to nekdy pomuze k lepsimu pochopeni, vic podobnych zpusobu. Nebo naopak k vetsimu zmatku :)
Když to uložim na disk, mam názvy dní a měsicu v češtině.
Když to pošlu do toho HTML, <img src="rrd.php" />, tak to mam v angličtině.
… To moc nechapu. Pokud to generuje program v linuxu, win, tak vystup v obrazku lze ovlivnit parametrem nebo nejakym prepnutim jazyka predem. V php totez nebo nastavenim header(). Tusim, ze jsem to nikdy nepouzil, tak spis takovy vyber moznosti z googlu, manual php.net
rrdtool graph … - cestina
SET … cestina
rrdtool graph …
$graphObj->setOptions($opts); // nekde v opt cestina
$lang = 'Czech';
//setlocale(LC_TIME, $lang);
//setlocale(LC_CTYPE, $lang);
//setlocale(LC_ALL, $lang.'.'.$codeset);
//setlocale(LC_ALL, "en_US.UTF-8");
setlocale(LC_ALL, 'Czech_Czech Republic.65001')
date_default_timezone_set('Europe/Prague');
header('Content-Type: text/html; charset=UTF-8');
$graphObj->setOptions($opts);
$integer = 123;
$string = "1234";
$znak = $string[1] // = 2
$pole = array();
$pole2 = array(1, 2, 3, 4);
$cislo = $pole2[2];
$pole3 = array('1', '2', '3', '4');
$znak = $pole3[2];
$pole4 = array('1' => 123, 'abc' => 456, 'z' = array(1, 2, 3));
$cislo2 = $pole4['1'];
$cislo3 = $pole4['abc'];
$pole5 = $pole4['z'];
$pole[0] = 123;
$pole['def'] = 'abc';
function aaa() {echo 123;}
aaa(); // volani
$x = 'aaa';// volani
$x();// volani
Zkousel jsi php.net/array nebo https://www.php.net/manual/en/book.array.php nebo google php array?
'V jakém případě je vhodné to použít, lze u databází a jaký druh u databází?'
Ta otazka nedava smysl. Databazi php nema. Sql database maji pole. Ale tam obvykle pouzivas sloupce. Vyjimecne potrebujes zapsat vice hodnot, kde nepotrebujes vyhledavat. Pak se to zapise obvykle jako string s odelovacem sloupcu.
Predstav si, ze mas data. Jak je zapises na papir? Mas cisla, text, datumy? Prevedes to do nejakeho formatu, ktery papir umi. To jsou znaky. V pripade db je to obvykle string, seznam znaku.
Databaze usporadava data do tabulek. Podobne jako mas tabulky v excelu. Nakresli si na papir tabulku, mrizku a zapis do ni pole? Jak vidis, na papire I v databazi obvykle maji sloupce presne rozmery. Rychleji se tak z tabulky tahaji data. Pak maji sloupce s promenou delkou, tam jsou data ulozeny obvykle ve format delka+text.
Nevim, co ti odpovedet na otazku database a pole.
google = database array
'How to store a array in a database? - Stack Overflow'
-> serialize ans unserialize functions
-> json_encode, json_decode
'Existuje nějaká alternativa k poli?'
String?
class?
google = php string
google = php class
$pole['def'] = 'abc';
$object->def = 'abc';
$object->{'def'} = 'abc';
Kdyz pisu prispevek a chci si precist nahore, co ten clovek psal, tak mi to zniceho nic samo kamsi odskoci na policko psani prispevky. Odroluji si nahoru a najednou blik a muzu rolovat znovu.
Uplne nechapu problem a jake mas k tomu znalosti. A me jsou spise zbezne.
Komunikace s sqlserverem (v pythonu asi pyodbc, viz gna):
- connect (server, login, psw)
- query, query, query...
- disconnect
Query je sql prikaz typu "SELECT sloupce FROM tabulka WHERE podminka ORDER BY sloupec". Server ti pak posle kopii radku, ktere odpovidaji pozadavku. Tvuj sql komunikacni program ti tento retezec znaku umi preformatovat pres Fetch funkce do radku a sloupcu.
Komunikace s Loratech server? To mi neni jasne. Jestli je tim myslis server s sql, znacky typu loratech nebo co. Ale jestli je to nejaky jiny server, tak se take pripojis, posles dotaz, co bys rad, odpojis.
SQL view, viz gna
Vysledkem sql dotazu je tabulka (v sql formatu). Pokud s tabulkou pracujes casto, vytvoris si na serveru k tabulce view.
Treba 100x chces SELECT a data v tabulce se nemeni. Tak normalne by sql server pokazde vybiral z tabulky podle podminek. Ale v pripade view si drzi vysledek v pameti a odesila uzivateli data ihned.
Nebo potrebujes z nekolika tabulek podle podminek vytahovat data. Muzes je pomoci SELECT spojit do jedne velke, ulozit do VIEW a pak tuto tabulku jeste dal filtrovat.
Proste je to ulozeni vysledku SQL dotazu do pameti.
A zpracovani kazde 2 min. Nevim, no. To je v podstate chat aplikace. U webu je treba vyhodnejsi provadet kesovani. Vygenerovat vysledky kod do souboru. Dokud nenastane UPDATE (zmena v tabulce), tak uzivateli poslat uz hotovy soubor. Coz zrovna u chatu moc nejde, tak se to samozrejme posila online.
To zadani mas od koho? Neni to nahodou ucitel? A neni nahodou placeny prave za to, aby vam pomohl?
VS nemam. C# mne nezajima.
V php nacteni souboru se provede pres (C# to ma podobne, zkus vygooglovat google = file read example c#)
$str = file_get_contents(path);
echo $str; // vypis na obrazovku
Na obarveni kodu se vetsinou pouzivaji nastroje, treba v js. Ale vas ucitel chce nejspis neco pomoci cyklu a c# nebo nastroj se c#. Precist znak ze souboru, zjistit, co to je a podle toho se rozhodnout, zda barvis nebo ukoncujes barveni a tak.
google = code hightlight syntax example c#
Jestli do ted vubec netusis, jak to funguje, cele, tak takhle
file c# -> c# server -> vygeneruje html -> posle pc uzivateli -> prevezne web browser -> zobrazi
Ve VS si muzes vyrobit c# file nebo html stranku, css a pod. Tento soubor musis nahrat na server, ktery umi c# zpracovat a prelozit ho do html kodu.
Chci rici, ze netusim, zda ti na preklad staci samotne c# nebo budes muset nekde spustit jeste server.
Na serveru preklad toho souboru spustis pak pres url v browseru, napr
localhost/mujweb/soubor.asp
Neva, no. Stale nechapu, co vlastne presne chces. Zkus obrazky, co to dela ted a co by to delat melo. Pripadne k tomu kod, treba I na jsfiddle.
Mozna, to, co hledas je prave obaleni stranky divem. Nastavis mu margin 0 auto + width.
<div>
<header>...</header>
<footer>...</footer>
</div>
Pokud bys to chtel resit, jak to mas na obrazku, 2 prouzky pres celou sirku stranky, tak bych tam pridal do kazde casti stejny 'container' (0 auto + width) a vnejsi casti nastavil ty prouzky. Tak, jak jsi to psal na zacatku. Slo by to resit I tim prvnim, ale musel bys pouzit obrazek na pozadi a to by vyzadovalo definovat presne vysku header a footer. Ale s obrazkem by slo zase carovat jako base64, nejaky ornament, spesl prechod, spesl okraje a tak.
<header><div>...</div></header>
<footer><div>...</div></footer>
#22 šnekr
isset($_SESSION["loginId"]) - a to je co, kdyz ne globalni promenna? :)
Josef Kulhavý
Jak zastavit setInterval?
this.func.timerStart = function()
{
//alert('start');
root.func.timerStop();
root.vars.timer.counter = 0;
root.vars.timer.timer = setInterval(root.func.timerRun, root.vars.timer.speed); // uloz timer do promenne
}
this.func.timerStop = function()
{
//alert('stop');
if (root.vars.timer.timer!=null)
{
clearInterval(root.vars.timer.timer); // zastav timer v promenne
}
root.vars.timer.timer = null;
}
this.func.timerRun = this.func.arrowGroupMove;
Tu kaskadu si nevsimej, je to soucasti class. Konkretne (mezera strili, spousti interval):
https://mlich.zam.slu.cz/x/js-tanks.htm
Asi nejlepe pouzitelny by mohl byt ten posl. example
http://php.net/…examples.php
-97 / Anonymous / 4 years ago
Aby bylo jasne, tak to odesial obecnou message. Ta byva typu ping, connect, disconnect, text (handshake, reply-handshake, text). Jako text si pak muzes odesilat zpravicky typu "tonda->all Ahoj". Anebo pouzit json a posilat slozitejsi konstrukce. Neresi to uzivatele, to musis resit dalsim systemem. Tohle prijme obecne zpravu. Neco jako na poste, spadne to do krabicky, tu krabicku si system preda pani postacce (dalsimu programu) a pani postatcka si precte adresy a teprve s tim neco dela. Ale to neni problem, zavolat dalsi sluzbu s logovanim uzivatelu, s databazi jmen a tak. Uzivatel ti jako text posle sve jmeno pri prihlaseni...
<?php
class MySocketServer
{
protected $socket;
protected $clients = [];
protected $changed;
function __construct($host = 'localhost', $port = 9000)
{
set_time_limit(0);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
//bind socket to specified host
socket_bind($socket, 0, $port);
//listen to port
socket_listen($socket);
$this->socket = $socket;
}
function __destruct()
{
foreach($this->clients as $client) {
socket_close($client);
}
socket_close($this->socket);
}
function run()
{
while(true) {
$this->waitForChange();
$this->checkNewClients();
$this->checkMessageRecieved();
$this->checkDisconnect();
}
}
function checkDisconnect()
{
foreach ($this->changed as $changed_socket) {
$buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
if ($buf !== false) { // check disconnected client
continue;
}
// remove client for $clients array
$found_socket = array_search($changed_socket, $this->clients);
socket_getpeername($changed_socket, $ip);
unset($this->clients[$found_socket]);
$response = 'client ' . $ip . ' has disconnected';
$this->sendMessage($response);
}
}
function checkMessageRecieved()
{
foreach ($this->changed as $key => $socket) {
$buffer = null;
while(socket_recv($socket, $buffer, 1024, 0) >= 1) {
$this->sendMessage(trim($buffer) . PHP_EOL);
unset($this->changed[$key]);
break;
}
}
}
function waitForChange()
{
//reset changed
$this->changed = array_merge([$this->socket], $this->clients);
//variable call time pass by reference req of socket_select
$null = null;
//this next part is blocking so that we dont run away with cpu
socket_select($this->changed, $null, $null, null);
}
function checkNewClients()
{
if (!in_array($this->socket, $this->changed)) {
return; //no new clients
}
$socket_new = socket_accept($this->socket); //accept new socket
$first_line = socket_read($socket_new, 1024);
$this->sendMessage('a new client has connected' . PHP_EOL);
$this->sendMessage('the new client says ' . trim($first_line) . PHP_EOL);
$this->clients[] = $socket_new;
unset($this->changed[0]);
}
function sendMessage($msg)
{
foreach($this->clients as $client)
{
@socket_write($client,$msg,strlen($msg));
}
return true;
}
}
(new MySocketServer())->run();
?>
Je to trochu veda. Bohuzel nemam nikde jednoduchy kod. Mam uz do nej primichane vselijake slozitosti pro lepsi ovladani, ukoncovani serveru a tak.
http://php.net/manual/en/sockets.examples.php
Server pro socket funguje tak,
- nastavis si php ne konenecny time_limit
- vytvoris si server (pripojis ho na port a tak) a pripojis na nej socket (jakoze hlavni socket - server pro uzivatele)
- vytvoris si nekonecnou smycku, ve ktere poslouchas, co se deje na socketech, a) hlavnim (1), b) ostatnich (0)
- pokud prijde neco na hlavni, zjistis, co to je. Pokud je to zadost o pripojeni, ta spustis vyvoreni dalsiho socket a odesles na novy socket handshake. Pokud to druha strana potvrdi, tak nechas socket otevreny. Pokud nee, socket odpojis a smazes ze seznamu ostatnich )
- a pak proveris vsechny otevrene sockety, zda jeste reaguji (druha strana je drzi otevrene) a kdyz ne, zavres je.
- a nebo z nich prectes message
Pri testovani si nastav limit jen tak na 5s.
Pokud server neukoncis, je nutne pak uplne vypnout php. Jinak ti bude blokovat na pc port, na kterem jsi server spustil. Je to takove hodne neprijemne, kdyz nevis, proc ti php odmita spustit stejny program, ktery jeste pred chvili bez problem spustil :)
Zvlastni, na vsech mych webech, kde jsem to pouzil, tak neviditelny input funguje. Asi to mas spatne udelane.
Staci treba 10x odeslat formular, kde vyplnim 25 a vzdycky to aspon 1x projde.
Spravne bys to mel mit tak, ze php generujes prazdny input. K nemu otazku. Odpoved nesmi byt 0 ani 1 a nebo se opakovat treba po 25 pokusech.
Zkoukni ulozto Maji 4 mistny pismenkovy captcha kod pro pomale stahovani. Zatim se mi nestalo, z 500 pokusu za posl. 5 let, ze bych videl stejny kod 2x. Je mozne, ze to nastalo, ze si to jen nepamatuji. Ale vetsinou si jejich kody podvedomne pamatuji, cili takovych min 30 urcite. Kdybych psal ten samy, urcite mozek rekne blik, to uz jsi psal.
Normalne bych to generoval hash z casoveho razitka kombinovaneho s ip, rekneme 5-10 min interval. Plus, ukladal bych do session pocet odeslanych zprav, ktery bych take zamontoval do toho hash. Aby po odeslani zpravy mel vzdy unikatni hash a nemohl odesilat na jeden a ten samy celych 10 minut. Jestli chces, muzu zkusit tu funkci vytvorit. Sice jsem hash takhle jeste nedelal, ale vsechno je jednou poprv
Jo, jenze strtolower se neda pouzit na utf, tam je mb_strtolower.
Jo, hele, mozna se vyplati resit naseptavani spis pomoci js a json kodu. Json tusim dela to, ze stejna slova koduje jako odkaz na text zpet. Cili, klidne stahnout celou db slov, seradis, a pak jen odkazujes zpetne na stejne useky. Nebo vlastni kod. Pr
vitejte
vitek
viteslav
vitejte
4k
4slav
Ono zalezi na tom, jak je to delane. Cim vic radku, tim vic jich musi php prelozit do kodu procesoru. Kdyz to jde, snazim se rozdelit program na logicke celky, ktere vyuziji ve vice souborech.
Jeste jsem neincludaval vic nez 10 souboru, ani kaskadne. Takze nemuzu rici, jaky to ma vliv. Obecne je dobre, kdyz ma disk soubory pohromade, ze je nenacita z ruznych mist. Ale u ssd je to asi fuk :) Obri soubory jsou obvykle pomale, si myslim. Ale zas treba, kdyz kopiruji na flashku, tak, kdyz se to presouva jako velky balik, je to vyrazne rychlejsi nez kdyz tam vytvari soubor po souboru do souboroveho systemu.
kes, ampersand, samozrejme, kdyz je to dalsi parametr :)
odkaz.php?data=456&odkaz=1
Nebo by slo pouzit primo v hrefu, ale pak je trosku slozitejsi to z tama vydolovat. Nebo aspon driv byvalo, mozna ted je na to funkce.
odkaz.php?data=456?odkaz=1
Muzes pouzit i javascript. Mas treba
<script>
odkaz = 'webapp.php';
items = document.getElementById('menu');
items = items.getElementsByTagName('A');
for (i=0; i<items.length; i++) {item = items[i]; if (item.href==odkaz) {item.className='active';}}
</script>
Nebo muzes jit treba podle poradoveho cisla
<a href="odkaz.php?data=123#0">...</a>
<a href="odkaz.php?data=456#1">...</a>
<script>
odkaz = location.hash; //1 mozna #1
items = document.getElementById('menu');
items = items.getElementsByTagName('A');
for (i=0; i<items.length; i++) {item = items[i]; if (i==odkaz) {item.className='active';}}
</script>
Jeste mozna jine cteni souboru
$data = file_get_content('soubor.txti');
Jinak, samozrejme pri vice zapisech je dobre pouzit flock, pro uzamceni souboru, pokud do nej zapisuje prave jiny prikaz.
Ja bych to resil pres databazi. Souborove to muzes resit stejne.
zapis.php?data='rozsvit'
precti.php - ktere soucasne smaze z db ten text
zp.php?akce=zapis&data='rozsvit'
zp.php?akce=precti
Na serveru se da php spoustet tusim pres 'php precti.php' (nebo 'http precti.php' nebo tak nejak se to tam dela).
Ale slo by to delat tak, ze ke kazdemu pozadavku pridas casove razitko. Funkce si pak precte jen radky v urcitem intervalu, ostatni ignoruje. A pak ti bezi na serveru jeste proces, ktery smaze radky se starsim razitkem. Ale prijde mi to na houbec, kdyz to muze delat zrovna ten php program.
No, a pak muzes v tom php predat data primo tomu dalsimu programu, neni treba to zapisovat. Nejdriv si overis, zda je to platny prikaz, ale.
<?php
$data = 'rozni';
shell_exec('jinyprogram.exe -data='.$data); // tady existuje asi 5 prikazu pro spousteni z command-line, google
//http://php.net/manual/en/function.exec.php
//exec();
//system() - Execute an external program and display the output
//passthru() - Execute an external program and display raw output
//escapeshellcmd() - Escape shell metacharacters
//pcntl_exec()
?>
Php generuje soubor. Soubor (data) muze byt obrazek, video, html, js, css, text, mp3, ... nebo jiny kod.
Pr. takovy jednoduchy ajax bez pouziti js httprequestu.
--- x.php ---
<?php
echo 'var a,b,c;';
echo 'a=3;';
echo 'alert(a);';
?>
--- y.htm ---
<script src="x.php"></script>
--- y2.htm ---
<script id='aaa'></script>
<script>document.getElementById('aaa').src='x.php';</script>
Js ajax dela to, ze stahne ze serveru soubor (anicka.jpg nebo soubor.php?name=anicka.jpg). Totez dela treba tag iframe src=..., img src=..., script src=..., link. Cili, ajax dela neco podobne jako v php file_get_contents. Jenom obvykle byva nastaveny asynchronne, jakoze stahuje napozadi a proto je treba k nemu pridat navratovou funkci. Priklad zapisu
function stahuj(soubor, cb) {...}
function stahuj_cb(data) {alert(data);}
stahuj('soubor.php?name=anicka.jpg', stahuj_cb);
stahuj('soubor.php?name=anicka.jpg', window.stahuj_cb); // nebo
stahuj('soubor.php?name=anicka.jpg', window['stahuj_cb']); // nebo
stahuj('soubor.php?name=anicka.jpg', top.window['stahuj_cb']); // pro subframe
stahuj('soubor.php?name=anicka.jpg', top.stahuj_cb); // pro subframe
x = new mujAjax();
x.file = 'soubor.php?name=anicka.jpg';
x.callback = window.stahuj_cb;
x.zacniStahovat();
To je jen priklad, jak to asi funguje. Jak je udelany ten objekt mujAjakx ve tvem programu vubec netusim.
Kdyz chces stahovat treba 10 souboru naraz, tak bys mel nekde promennou, kde bys ukladal, zda je to completed a kdyz jse vsech 10, tak zavolas treba dalsi funkci. Nebo to muzes stahovat postupne, nastavis prenos na synchronni. A nebo muzes pouzit i asynchronni, ale pak to ale budes mit kaskadne.
stahuj('soubor1', stahuj2);
stahuj2('soubor2', stahuj3);...
Nevyhoda synchronniho je, ze program ceka, az se js vykona, dostahuji data. Takze se to moc nepouziva.
Ano, jsou programy a hostingy, ktere maji nainstalovany prohlizec a dovedou vykreslit vystup do obrazku.