Ausgang per Web schalten mit PHP

( #define NUMTIMER = 3; // wieviele timer es gibt (15,30,60 min) <-- Oder falsch verstanden ?

Leider ja, denn die 15,30 und 60 Minuten sind ja nur eine Zeit, von der Du eine auswählst, das hat ja noch nichts mit einem Timer zu tun.
Verschiedene Timer brauchst Du, wenn Du mehrere Ventile steuern willst.
Z.B. timerpin[0]=9, timerlength[0]=900 würde den ersten Timer für Pin 9 auf 900 Sekunden (15min) setzen.
timerpin[1]=10, timerlength[1]=3600 wäre dann der 2. Timer für Pin 10 und 60 Minuten.

digitalWrite(timerpin[t],!digitalRead(timerpin[t])); 
sieht seltsam aus, funktioniert aber.

unsigned long previousMillis = 0;       // speichert wie viele Sekunden seit derletzten aenderung vergangen sind
#define NUMTIMER[] = 3;          // wieviele timer es gibt (15,30,60 min)
int timerpin;
int timerlength;

Die previousMillis sind richtig, aber das define nicht. Wie bereits geschrieben, müssen timerpin und timerlength beides Arrays sehen.
Also

unsigned long previousMillis = 0;       // speichert wie viele Sekunden seit derletzten aenderung vergangen sind
#define NUMTIMER 3          // wieviele timer es gibt (15,30,60 min)
int timerpin[NUMTIMER];
int timerlength[NUMTIMER];
...
void setup() {
...
}

Hinter das "#define" kommt kein Semikolon und die Zuweisung erfolgt auch nicht mit einem "=". "define" ist eine Präprozessoranweisung für den Compiler. Der geht einfach nur stumpf durch den gesamten Code und ersetzt überall das "NUMTIMER" durch die 3, das hat noch nichst mit dem Programm zu tun, das ist reine Textersetzung. Das Trick dabei ist, das man später die Anzahl der Arrayeinträge an einer einzigen Stelle ändern kann, ohne die 3 überall im Code zu ersetzen.

Die Auswertung für die vergangene Zeit darf auch nicht innerhalb des "if(client)" Blocks stehen, denn die Zeit läuft ja auch weiter wenn kein Client connected ist.
Am besten setzt Du den Zeit-Auswertungsblock gleich an den Anfang der loop().

Was bei der Auswertung des Kommandos "T" noch fehlt, ist das Setzen des übergebenen Timer-Wertes. Der muss ja irgendwo gespeichert werden, ebenso wie die Pin Nummer, die dem Timer zugeordnet ist.

Die Lösung selbst ist eigentlich nicht schwer, Du versuchst aber alles auf einmal zu machen und dafür fehlt die zur Zeit noch das Wissen und die Übersicht. Versuch daher erstmal den Ablauf wie Du ihn verstehst zu beschreiben. Sobald das stimmt und Du verstehst was, wann wie passieren soll, dann fängst Du an das in ein C Programm zu giessen.