Ankündigung

Einklappen
Keine Ankündigung bisher.

shared memory vs. socket

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • shared memory vs. socket

    Ich will eine Datenübertragung von vom Apache gesteuertes Skript zu Daemon haben. Stellt sich doch die Frage was besser ist (Pros & Cons): shared memory oder udp socket listener?

    Eine Umsetzung von shared memory-Kommunikation würde wie folgt aussehen:

    Der allokierte shared memory Block wäre von einer Größe (Maximale Anzahl an gleichzeitig verarbeitbaren Requests durch den Apache) Bytes. Ein gesetztes Byte bedeutet dass ein Prozess den Block ftok(DAEMON_PATH, 't')+X+1 beschrieben allokiert und beschrieben hat, wobei X der Platz des Bytes in der shared memory ist.
    Bei Änderungen am shmop sollte ein PCNTL signal gesendet werden vom entsprechenden Prozess an den Daemon.

    Ein Beispiel fürs auslesen:
    PHP-Code:
    $ftok ftok(DAEMON_PATH't');
    @
    shmop_delete(@shmop_open($ftok"w"00)); // clean up older shmop's
    $shmop = @shmop_open($ftok"c"0666MAX_APACHE_REQS);
    $last_string str_repeat("0"MAX_APACHE_REQS);
    pcntl_signal(SIGHUP, function () use ($shmop, &$last_string$ftok) {
        
    $string shmop_read($shmop0MAX_APACHE_REQS);
        for (
    $i 0$i MAX_APACHE_REQS$i++) {
            if (
    $string[$i] !== "0" && $string[$i] !== "") { // New data
                
    $tmp_shm shmop_open($ftok $i 1"w"00);
                
    do_something_with_data(shmop_read($tmp_shm0shmop_size($tmp_shm)));
                
    shmop_delete($tmp_shm);
                
    shmop_write($shmop"0"$i);
            }
        }
    }); 
    Wie ein normaler socket listener aussieht, das muss ich euch wohl nicht vormalen?^^


    Fragt sich nur was welche Nachteile & Vorteile hat...?

  • #2
    shared memory dürfte spätestens bei verschiedenen security frameworks schwierig werden.
    allerdings kannste da wesentlich mehr daten wesentlich schneller durch die gegend scheiben.

    Kommentar


    • #3
      Soll das ganze unter Windows laufen oder warum ziehst du UDP-Sockets IPC-Sockets vor?
      Crashkurs zum Thema Grammatik: die Standart (der Standart)

      Kommentar


      • #4
        @moma: was ist da das Problem bei security frameworks?

        @Darky: Musste erst mal googeln was IPC ist…

        Unix domain sockets habe ich noch nie ausprobiert. Mal testen

        EDIT: kann man dafür die recvmsg/sendmsg Funktionen von PHP 5.5 nutzen? Die Funktionen sind noch nicht dokumentiert; hat jemand eine Ahnung wie man die nutzt?

        Kommentar


        • #5
          ich weis nich was du für ne aplikation schreibst, aber nicht nur CONFIG_GRKERNSEC_CHROOT_SHMAT (..)
          If you say Y here, processes inside a chroot will not be able to attach to shared memory segments that were created outside of the chroot jail. It is recommended that you say Y here. If the sysctl option is enabled, a sysctl option with name chroot_deny_shmat is created.
          möglicherweise seh ich ja nur gespenster, aber die anpassungen können bei ungeübten admins viel support verlangen.

          Kommentar


          • #6
            Und was genau hat das hiermit zu tun? Ich ändere doch weder den mode der shared mem noch ist die executable?

            Das sieht mir doch eher nach einem Gespenst aus....

            Kommentar


            • #7
              http://git.php.net/?p=php-src.git;a=...multi_msg.phpt

              Wenn ich den Test richtig verstehe funktionniert socket_sendmsg so:

              PHP-Code:
              $r socket_sendmsg($sending_socket, [
                  
              "name" => [ "addr" => "unix:///path/to/unix/domain/socket""port" => 0],
                  
              "iov" => [$string_with_data],
                  
              "control" => [[
                      
              "level" => ?,
                      
              "type" => ?,
                      
              "data" => ?,
                  ]]
              ], 
              0); 
              Was da in "control" sein soll, hab ich keine Ahnung, mag mir jemand weiterhelfen? In den man-Pages zu sendmsg() lese ich "The ancillary data"… Aber was ist damit gemeint?

              Kommentar


              • #8
                http://books.google.de/books?id=dofK...2Frecv&f=false

                sorry für den langen link.

                Kommentar


                • #9
                  Ich habe mir es bereits zweimal angeguckt aber ganz schlau werd ich nicht daraus?

                  Kommentar


                  • #10
                    hilft dir das, bzw die anderen verlinkten mans weiter?
                    http://man7.org/linux/man-pages/man3/cmsg.3.html
                    http://tldp.org/LDP/lpg/node7.html

                    Kommentar


                    • #11
                      Sofern du keine Realtime Verarbeitung benötigst, empfiehlt sich an dieser Stelle sicherlich das Message Queue Konzept (z.B. RabbitMQ). Dadurch würde auch die direkte Abhängigkeit beider Dienste entkoppelt.

                      Grüße Robert
                      Echtzeit Weltraumstrategie Browsergame: Asteroid Impact

                      Kommentar


                      • #12
                        Ja, ich brauch realtime.

                        @moma: Ich glaub ich bin zu doof um das zu verstehen… Ich warte mal auf die Doku von php.net………

                        Kommentar

                        Lädt...
                        X