php / php/php-src

Ability to pick PHP value by reference in FFI.

Offen
#7,866 9 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Extension: ffi Feature Status: Needs Triage
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.1k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

Description

HI!
Currently the only way convert php value to FFI value is memcpy (or other ways with memory copying involved).
It could be wasting if we for example received large chunk from socket and need to deal with it through FFI.
For example,

/* Initial */
echo memory_get_usage(); // 348504

/* Got chunk of data */
$data = str_repeat('1', 512 << 10);
echo memory_get_usage(); // 876992

/* Defining the FFI type */
$type = FFI::arrayType(FFI::type('char'), [512 << 10]);
echo memory_get_usage(); // 877184

/* Allocating memory for type */
$ffiValue = FFI::new($type);
echo memory_get_usage(); // 1401984

/* And memcpy */
FFI::memcpy($ffiValue, $data, 512 << 10);
echo memory_get_usage(); 1402048

It would be great to have ability to reflect value from PHP to FFI using it by reference like so:

$data = str_repeat('1', 512 << 10);

/* @var FFI\CData $ffiValue */
$ffiValueCharArray = FFI::represent('char[]', &$data, size: 512 << 10); // No additional memory allocations for $data content

$ffiValueCharArray [1] = 5;
var_dump($data[1]); // $data changed by reference

$ffiValueInt32 = FFI::represent('int32_t', &$data, size: 4, offset: 12);
var_dump($ffiValueInt32->cdata); // substr($data, 12, 4) === "1111", we will get here 825307441

$ffiValueInt32->cdata = 10;
var_dump(bin2hex(substr($data, 12, 4))); // "0a000000"

Also could work not only with strings:

$int = 10;

$ffiValueInt64 = FFI::represent('int64_t', &$int); // length argument could be omitted if cast performed to fixed size type
var_dump($ffiValueInt64->cdata); // 10;

$ffiValueInt64->cdata = 20;
var_dump($int); // 20;

$readOverBoundary = FFI::represent('char[]', &$int, 10); // Exception: attempt to read over boundary

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit den in den Beispielen gezeigten Einstiegspunkten FFI::type, FFI::arrayType, FFI::new und FFI::memcpy und ermittle anschließend, ob die vorgeschlagene Referenzsemantik zu PHPs Wert- und Speichermodell passt. Abgeschlossen ist die Arbeit, wenn ein von den Maintainer:innen genehmigtes Design für das vorgeschlagene Verhalten von FFI::represent erreicht wurde.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c, php
Bereich
backend
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.