[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
[RexSEO] goes GitHub.. - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

[RexSEO] goes GitHub..

9. Mär 2012, 14:55

Moin,

parallel zu Markitup ist auch RexSEO jetzt komplett incl. Wiki, Tickets & DLs zu GitHub umgezogen:

https://github.com/gn2netwerk/rexseo sprich:

- Wiki: https://github.com/gn2netwerk/rexseo/wiki
- Issues: https://github.com/gn2netwerk/rexseo/issues
- DLs: https://github.com/gn2netwerk/rexseo/downloads

Auch hier: das SVN repo an sich bleibt erstmal bestehen und ist über die gewohnte URL erriechbar, die bisherigen Sections für Tickets, etc. @ GN2 Redmine sind aber abgeschaltet..

Umfrage zu den "neue Version" Meldungen
Aus Beobachtung der DL Zahlen nach einem neuen Release weiß ich, daß diese Meldung doch erstaunlich viele User anspricht.. zumindest mal dazu das neue Release runterzuladen. Da das ganze technisch an Redmine gebunden ist welches nun vom Tisch ist: Schlimm wenn die update Meldungen einfach rausfliegen? Ich könnt das zwar für GitHub umstricken, aber da is mir grad nicht danach, d.h. würds dann eher einfach weglassen.. ;->

lg,Jan
vg, Jan

Hirbod
Beiträge: 435
Registriert: 15. Jan 2008, 14:46

Re: [RexSEO] goes GitHub..

9. Mär 2012, 15:40

-1 dafür.

Ich liebe die Update Benachrichtigung.

Ansonsten +1 für den Rest!

Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

Re: [RexSEO] goes GitHub..

9. Mär 2012, 19:21

Hirbod hat geschrieben:Ich liebe die Update Benachrichtigung.
mift.. ;-> na gut, wird aber noch n paar tage dauern, weil die verfügbare GitHub Api PHP Klasse bis dato nur API2 kann, und ich dafür aber API3 brauch -> zu Fuß das ganze per curl etc.. 8-}
vg, Jan

Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

Re: [RexSEO] goes GitHub..

17. Mär 2012, 15:25

vg, Jan

Hirbod
Beiträge: 435
Registriert: 15. Jan 2008, 14:46

Re: [RexSEO] goes GitHub..

18. Apr 2012, 18:19

Hi Jan,

du hast das ganze neue Version-Ding ja mit CURL gemacht. Würde ich nicht empfehlen, ist nicht überall installiert, vor allem nicht default.

Nimm doch lieber Gregor Harlans Socket-Class dafür, dies fuktioniert wohl auf jeder PHP-Umgebung. Hier die 5+ kompatibele Version. (Funzt auch mit 5.3+)

Code: Alles auswählen

<?php

/**
* Class for sockets
*
* @author gharlan
*/
class rex_socket
{
  private $prefix;
  private $host;
  private $path;
  private $port;
  private $timeout;
  private $headers = array();
  private $fp;
  private $data;
  private $files;
  private $chunked = false;
  private $chunkPos = 0;
  private $chunkLength = 0;
  private $status;
  private $statusMessage;
  private $header;
  private $body;

  public function __construct($host, $path = '/', $port = 80, $prefix = '', $timeout = 15)
  {
    $this->prefix = $prefix;
    $this->host = $host;
    $this->path = $path;
    $this->port = $port;
    $this->timeout = $timeout;
  }

  static public function createByUrl($url, $timeout = 15)
  {
    $parts = parse_url($url);
    if(!isset($parts['host']))
    {
      throw new rex_socket_exception('It isn\'t possible to parse the URL "'. $url .'"!');
    }
    $host = $parts['host'];
    $path = (isset($parts['path'])     ? $parts['path']          : '/')
          . (isset($parts['query'])    ? '?'. $parts['query']    : '')
          . (isset($parts['fragment']) ? '#'. $parts['fragment'] : '');
    $port = 80;
    $prefix = '';
    if(isset($parts['scheme']))
    {
      $supportedProtocols = array('http', 'https');
      if(!in_array($parts['scheme'], $supportedProtocols))
      {
        throw new rex_socket_exception('Unsupported protocol "'. $parts['scheme'] .'". Supported protocols are '. implode(', ', $supportedProtocols). '.');
      }
      if($parts['scheme'] == 'https')
      {
        $prefix = 'ssl://';
        $port = 443;
      }
    }
    $port = isset($parts['port']) ? $parts['port'] : $port;
    return new self($host, $path, $port, $prefix, $timeout);
  }

  public function addHeader($key, $value)
  {
    $this->headers[$key] = $value;
  }

  public function addBasicAuthorization($user, $password)
  {
    $this->addHeader('Authorization', 'Basic '. base64_encode($user .':'. $password));
  }

  public function doGet()
  {
    $this->doRequest('GET');
  }

  public function doPost($data = '', array $files = array())
  {
    if(is_array($data) && !empty($files))
    {
      $this->data = $data;
      $this->files = $files;
      $data = 'buildMultipart';
    }
    else
    {
      if(is_array($data) && !is_callable($data))
        $data = http_build_query($data);
      $this->addHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    $this->doRequest('POST', $data);
  }

  public function doDelete()
  {
    $this->doRequest('DELETE');
  }

  public function doRequest($method, $data = '')
  {
    if(!is_string($data) && !is_callable($data))
    {
      throw new rex_socket_exception(sprintf('Expecting $data to be a string or a callable, but %s given!', gettype($data)));
    }
    if(!($this->fp = @fsockopen($this->prefix . $this->host, $this->port, $errno, $errstr)))
    {
      throw new rex_socket_exception($errstr .' ('. $errno .')');
    }

    stream_set_timeout($this->fp, $this->timeout);

    $eol = "\r\n";
    $headers = array();
    $headers[] = strtoupper($method) .' '. $this->path .' HTTP/1.1';
    $headers[] = 'Host: '. $this->host;
    $headers[] = 'Connection: Close';
    foreach($this->headers as $key => $value)
    {
      $headers[] = $key .': '. $value;
    }
    foreach($headers as $header)
    {
      fwrite($this->fp, str_replace(array("\r", "\n"), '', $header) . $eol);
    }
    if(is_callable($data))
    {
      call_user_func($data, $this->fp);
    }
    elseif(is_string($data) && method_exists($this, $data))
    {
      $this->$data();
    }
    else
    {
      fwrite($this->fp, 'Content-Length: '. strlen($data) . $eol);
      fwrite($this->fp, $eol . $data);
    }
    $this->headers = array();

    $meta = stream_get_meta_data($this->fp);
    if($meta['timed_out'])
    {
      throw new rex_socket_exception('Timeout!');
    }

    while(!feof($this->fp) && strpos($this->header, "\r\n\r\n") === false)
    {
      $this->header .= fgets($this->fp);
    }
    if(preg_match('@^HTTP/1\.\d ([0-9]{3}) (\V*)@', $this->getHeader(), $matches))
    {
      $this->status = intval($matches[1]);
      $this->statusMessage = $matches[2];
    }
    $this->chunked = stripos($this->header, 'transfer-encoding: chunked') !== false;
  }

  private function buildMultipart()
  {
    $fp = $this->fp;
    $data = $this->data;
    $files = $this->files;
    $boundary = '----------6n2Yd9bk2liD6piRHb5xF6';
    $eol = "\r\n";
    fwrite($fp, 'Content-Type: multipart/form-data; boundary='. $boundary . $eol);
    $dataFormat = '--'. $boundary . $eol . 'Content-Disposition: form-data; name="%s"'. $eol . $eol;
    $fileFormat = '--'. $boundary . $eol . 'Content-Disposition: form-data; name="%s"; filename="%s"'. $eol .'Content-Type: %s'. $eol . $eol;
    $end = '--'. $boundary .'--'. $eol;
    $length = 0;
    $temp = explode('&', http_build_query($data, '', '&'));
    $data = array();
    $partLength = strlen(sprintf($dataFormat, '') . $eol);
    foreach($temp as $t)
    {
      list($key, $value) = array_map('urldecode', explode('=', $t, 2));
      $data[$key] = $value;
      $length += $partLength + strlen($key) + strlen($value);
    }
    $partLength = strlen(sprintf($fileFormat, '', '', '') . $eol);
    foreach($files as $key => $file)
    {
      $length += $partLength + strlen($key) + strlen(basename($file['path'])) + strlen($file['type']) + filesize($file['path']);
    }
    $length += strlen($end);
    fwrite($fp, 'Content-Length: '. $length . $eol . $eol);
    foreach($data as $key => $value)
    {
      fwrite($fp, sprintf($dataFormat, $key) . $value . $eol);
    }
    foreach($files as $key => $file)
    {
      fwrite($fp, sprintf($fileFormat, $key, basename($file['path']), $file['type']));
      $file = fopen($file['path'], 'rb');
      while(!feof($file))
      {
        fwrite($fp, fread($file, 1024));
      }
      fclose($file);
      fwrite($fp, $eol);
    }
    fwrite($fp, $end);
  }

  public function getStatus()
  {
    return $this->status;
  }

  public function getStatusMessage()
  {
    return $this->statusMessage;
  }

  public function getHeader($key = null, $default = null)
  {
    if($key === null)
    {
      return $this->header;
    }
    $key = strtolower($key);
    if(isset($this->headers[$key]))
    {
      return $this->headers[$key];
    }
    if(preg_match('@^'. preg_quote($key, '@') .': (\V*)@im', $this->header, $matches))
    {
      return $this->headers[$key] = $matches[1];
    }
    return $this->headers[$key] = $default;
  }

  public function getBufferedBody($length = 1024)
  {
    if(feof($this->fp))
    {
      return false;
    }
    if($this->chunked)
    {
      if($this->chunkPos == 0)
      {
        $this->chunkLength = hexdec(fgets($this->fp));
        if($this->chunkLength == 0)
        {
          return false;
        }
      }
      $pos = ftell($this->fp);
      $buf = fread($this->fp, min($length, $this->chunkLength - $this->chunkPos));
      $this->chunkPos += ftell($this->fp) - $pos;
      if($this->chunkPos >= $this->chunkLength)
      {
        fgets($this->fp);
        $this->chunkPos = 0;
        $this->chunkLength = 0;
      }
      return $buf;
    }
    else
    {
      return fread($this->fp, $length);
    }
  }

  public function getBody()
  {
    if($this->body === null)
    {
      while(($buf = $this->getBufferedBody()) !== false)
      {
        $this->body .= $buf;
      }
    }
    return $this->body;
  }

  public function writeBodyTo($resource)
  {
    $success = true;
    while($success && ($buf = $this->getBufferedBody()) !== false)
    {
      $success = (boolean) fwrite($resource, $buf);
    }
    return $success;
  }

  public function __destruct()
  {
    if(is_resource($this->fp))
    {
      fclose($this->fp);
    }
  }
}

class rex_socket_exception extends Exception
{
  public function __construct($message, $code = E_USER_ERROR)
  {
    parent::__construct($message, $code);
  }
}
Und abholen kannste alles so:
(wenn du Dateien abholst und speichern willst (eq zu file_get_contents, nur ohne Limits ;))
In dem Fall $path setzen.

Code: Alles auswählen

        
        try {
            $socket = rex_socket::createByUrl("http://www.download.de/datei.zip");
            $socket->doGet();
            $res = fopen($path, 'w');
            $file_output = $socket->writeBodyTo($res);
            
        } catch (rex_socket_exception $e) {
            // fehlermeldung:
             echo rex_warning($e->getMessage());
        }

Und wenn du nur nen String, Array oder JSON verarbeiten willst, brauchste nix schreiben, sondern nur abholen:

Code: Alles auswählen

try {
            $socket = rex_socket::createByUrl("http://www.url.de/path/zu/irgendwas");
            $socket->doGet();
            $file_output = $socket->getBody();
            
        } catch (rex_socket_exception $e) {
            // fehlermeldung:
             echo rex_warning($e->getMessage());
        }
In $file_output haste dann wohl Versionsnummer oder was auch immer.

LG
Hirbod

Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

Re: [RexSEO] goes GitHub..

18. Apr 2012, 22:04

thx für die schnipsel.. 'ere it is: https://github.com/gn2netwerk/rexseo/co ... 4c8eb7ee3a
vg, Jan

Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

Re: [RexSEO] goes GitHub..

19. Apr 2012, 00:02

vg, Jan

Hirbod
Beiträge: 435
Registriert: 15. Jan 2008, 14:46

Re: [RexSEO] goes GitHub..

19. Apr 2012, 14:05

Nice. Was wuerdest du davon halten einen eigenen Updatemech. mit der Socket Class zu bauen? Einfach zusaerzlich nen Link Update iwo rein und dann zip-file abholen, entpacken und Daten ueberschreiben? Nur als Idee..

Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

Re: [RexSEO] goes GitHub..

23. Apr 2012, 02:22

Hirbod hat geschrieben:Was wuerdest du davon halten einen eigenen Updatemech. mit der Socket Class zu bauen?
Nope.. ich will nicht noch mehr Komplexität in RexSEO reinstricken. Eher das Gegenteil.. z.b. soll das ganze Redirects Managament künftig als Plugin ausgelagert werden, einfach damit der Core von RexSEO wieder schlanker wird. Außerdem ist sowas imho Aufgabe des frameworks, bzw. eines Addons.. und das gibt es ja. ;)
vg, Jan

Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

Re: [RexSEO] goes GitHub..

10. Mai 2012, 17:25

FYI: Aktuelle RexSEO dev Version (1.4.284 dev):

* Neuer EP REXSEO_SPECIAL_CHARS ermöglicht es die Zeichenersetzung aus der Redaxo .lang Datei zu ändern.. d.h. man kann z.b. clang spezifische Zeichenersetzungen machen.
* An entscheidenden Stellen wird gecheckt ob die RexSEO Metainfo-Felder existieren, und bei Bedarf nachinstalliert/gefixt.. das sollte die gelegentlich auftretenden "RexSEO macht keinen rewrite" Fälle aus der Welt schaffen.
* notices beim hinzufügen von neuen Sprachen gefixt

Die Version läuft als "dev" weil ich grad keine Zeit habe ausgiebig zu testen.. ich denke zwar es paßt alles, aber mei.. daher: Version gibts erstmal nicht als DL, man muß einfach direkt nen DL bei Hithub von der files Seite ziehen.

feedback welcome.. echte Fehler am besten gleich @ Github melden
vg, Jan

Zurück zu „Allgemeines [R4]“