# Phplibary "Php-RRule" importieren



## Jessi Development (16. Feb 2018)

Hallo,

ich möchte mit der oben genannten Libary verschiedene Intervalle ausführen.
https://github.com/rlanvin/php-rrule

Eine Aktion jede Woche, eine jeden Monat und villeicht noch mehr.
Um das zu testen möchte ich es mal minütlich ausprobieren.

Da ich den Composer nicht verwende habe ich die Php Dateien der Libary in einen Ordner kopiert und möchte die Datei RRule.php in mein Script einbinden.
Das scheint auch zu funktioniern, aber es kommt die Fehlermeldung dass das Interface das an dem Objekt RRule mit dran ist nicht gefunden wurde.

Mein Testcode ist zum Teil von der Doku der Libary rauskopiert. Was ich geändert habe ist dass er jede Minute eine Mail schicken soll.

```
<?php
require('./rrule/RRule.php');
use RRule\RRule;
$rrule = new RRule([
   'FREQ' => 'MINUTELY',
   'INTERVAL' => 1,
   'DTSTART' => '2015-06-01',
   'COUNT' => 6
]);
foreach ( $rrule as $occurrence ) {
   foreach ($rrule as $occurrence ) {
   mail ( "Empfänger" , "Minütliche Nachricht." , "Blabla nachricht" , "From: Absender <Absender>");
}
}
echo $rrule->humanReadable(),"\n";
?>
```
Liebe Grüße


----------



## krgewb (16. Feb 2018)

Für PHP-Code gibt es hier auch Syntax-Highlighting:


```
<?php
require('./rrule/RRule.php');
use RRule\RRule;
$rrule = new RRule([
'FREQ' => 'MINUTELY',
'INTERVAL' => 1,
'DTSTART' => '2015-06-01',
'COUNT' => 6
]);
foreach ( $rrule as $occurrence ) {
foreach ($rrule as $occurrence ) {
mail ( "Empfänger" , "Minütliche Nachricht." , "Blabla nachricht" , "From: Absender <Absender>");
}
}
echo $rrule->humanReadable(),"\n";
?>
```


----------



## Jessi Development (16. Feb 2018)

Oh vielen Dank. Wusste nicht wie das geht.


----------



## Tobse (17. Feb 2018)

@krgewb require()? wirklich?

Das Projekt hat eine Composer Anbindung (vgl. Maven und Maven Central Repository). Dashier ist der State-of-the-Art weg, libraries in PHP einzubinden:

1. Composer installieren
2. Terminal Starten und ins Projektverzeichnis wechseln (cd)
3. Befehl _composer init_ ausführen
4. Befehl _composer require rlanvin/php-rrule_ ausführen
5. In PHP _require('/pfad/zum/projektverzeichnis/vendor/autoload.php'); use RRule\RRule;_


----------



## Jessi Development (17. Feb 2018)

Ok dann hab ich mir das einfacher vorgestellt.
Danke dir ich probiere es mal aus.


----------



## Jessi Development (17. Feb 2018)

Also ich hab gerade nochmal nachgelesen auf der Githubseite und da gibt es auch eine Alternative.

*Alternative method (not recommended)*

Download the latest release
Put the files in a folder that is autoloaded, or include or require them

So hab ich es mir auch vorgestellt. Ich habe meinen Code auf dem Notepad++ geschrieben und möchte auch nur ein kleines Script schreiben.
Aus dem Grund auch das "require". Aber damit komm ich wieder zu meinem ursprünglichen Problem undzwar dass er das Interface nicht findet.


----------



## thecain (17. Feb 2018)

"not recommended"


----------



## Jessi Development (18. Feb 2018)

Schon aber kann ja sein dass es jemand schonmal über diesen Weg mit einer anderen Libary oder so gemacht hat.


----------



## Tobse (18. Feb 2018)

Jessi Development hat gesagt.:


> Schon aber kann ja sein dass es jemand schonmal über diesen Weg mit einer anderen Libary oder so gemacht hat.


Das war in der PHP-Welt auch lange der offizielle Weg. Composer macht intern auch genau das. Mit require hast du aber zwei Probleme:


require() und use() duplizieren sich. In jeder Datei deiner Software hättest du dann require_once() und use für den selben Code.
require() ist abhängig von Dateipfaden. Wenn in den 400 Dateien deiner Software überall require_once() benutzt wird, kannst du Dateien nicht mehr verschieben, ohne schwere Probleme zu bekommen. Die Datei ist quasi für immer an diesem Platz gefangen.

Composer behebt diese Probleme: man braucht nur einziges require() in deiner ganzen Anwendung, egal wie viele und egal welche Libraries du einsetzt. Du kannst mit Composer eine Software mit 30.000 Zeilen, 400 Klassen und 50 externen Libraries schreiben und dabei nur ein einziges require() im ganzen Code haben. Übrig bleiben nur die use Statements; und die sind viel unproblematischer.


----------



## Jessi Development (18. Feb 2018)

Also so viel benötige ich eigentlich auch nicht. Ich benötige nur eine Klasse. Ich will ein Script schreiben dass einfach nur einmal in der Minute eine bestimmte Aktion ausführt. Eine Anwendung ist da garnicht mit dran. Nur das eine Script.


----------



## Tobse (18. Feb 2018)

Ich sage ja auch nicht, dass du require() nicht verwenden darfst  da die Frage aber doch sehr allgemein war wollte ich das nicht so stehen lassen. Denn so wie es komplexer wird, tut man sich mit Composer einen ziemlichen Gefallen. Was für deinen Use-Case das beste ist, entscheidest du ganz allein


----------



## Thallius (18. Feb 2018)

Tobse hat gesagt.:


> Composer behebt diese Probleme: man braucht nur einziges require() in deiner ganzen Anwendung, egal wie viele und egal welche Libraries du einsetzt. Du kannst mit Composer eine Software mit 30.000 Zeilen, 400 Klassen und 50 externen Libraries schreiben und dabei nur ein einziges require() im ganzen Code haben. Übrig bleiben nur die use Statements; und die sind viel unproblematischer.



Hm mal ganz im Ernst, welche IDE bietet denn heute kein Projektweites Search/Replace? Finde ich jetzt nicht komplizierter oder unpraktischer als den ganzen Rattenschwanz eines Composers mit mir rumzuschleppen....


----------



## Tobse (18. Feb 2018)

Thallius hat gesagt.:


> Hm mal ganz im Ernst, welche IDE bietet denn heute kein Projektweites Search/Replace? Finde ich jetzt nicht komplizierter oder unpraktischer als den ganzen Rattenschwanz eines Composers mit mir rumzuschleppen....


PHPStorm kommt super damit zurecht, die use statements anzupassen, wenn du eine Klasse in einen anderen Namespace verschiebst. Keine Aktion von mir notwendig außer die Move-Funktion der IDE zu benutzen. Die ganzen require()s anzupassen ist ein manuelles search & replace und aufwendiger. Ausserdem ist ja trotzdem alles doppelt:


```
<?php
namespace MyNS;

require_once(dirname(__FILE__) . '/../vendor/somevendor/somelib/Other/Namesapce/Class1.php');
require_once(dirname(__FILE__) . '/../vendor/somevendor/somelib/Other/Namesapce/Class2.php');
require_once(dirname(__FILE__) . '/../vendor/somevendor/somelib/Other/Namesapce/Foobar/Class3.php');
require_once(dirname(__FILE__) . '/../vendor/somevendor/somelib/Other/Namesapce/Foobar/Class4.php');

use Other\Namespace\Class1;
use Other\Namespace\Class2;
use Other\Namespace\Foobar\Class3;
use Other\Namespace\Foobar\Class4;

class MyClass {
}
```

vs.


```
<?php
namespace MyNS;

use Other\Namespace\Class1;
use Other\Namespace\Class2;
use Other\Namespace\Foobar\Class3;
use Other\Namespace\Foobar\Class4;

class MyClass {
}
```

--- also ich weiss, was ich bevorzuge. In Java ist es doch genauso: den Classpath lässt man sich von der IDE oder von Maven oder Gradle basteln. Wann hast du zuletzt händisch einen Classpath über 20 Libraries gebaut und fandest es besser als ein Build-Tool. Der Overhead von Composer ist minimal - es sind zwei Dateien im VCS, welche nicht mehr oder weniger Information enthalten als jede Maven oder Gradle Konfiguration auch. Das managen von Versionen und Updates nimmt es dir auch ab.


----------



## Jessi Development (23. Feb 2018)

Also vielen Dank für die vielen Antworten. Aber die bringen mich nicht wirklich weiter.
Ich habe mich jetzt dazu entschieden diese Libary nicht zu benutzen sondern verwende statdessen Cronjobs.


----------

